summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demo.stage6
-rw-r--r--src/parser.l2
-rw-r--r--src/parser.y22
-rw-r--r--support/vim/syntax/stage.vim2
4 files changed, 28 insertions, 4 deletions
diff --git a/demo.stage b/demo.stage
index 852deee..5a3fe2e 100644
--- a/demo.stage
+++ b/demo.stage
@@ -118,9 +118,10 @@ situation <<beachEast>>
118 } 118 }
119 enter 119 enter
120 { 120 {
121 display('''You're standing on a narrow stretch of beach.[break] The ocean 121 display('''You're standing on a narrow stretch of beach. The ocean
122 sparkles to the north, there's a cliff face just to the south. The 122 sparkles to the north, there's a cliff face just to the south. The
123 beach extends [green>westward<green]. To the east are some jagged rocks.'''); 123 beach extends [green>westward<green]. To the east are some jagged
124 rocks.''');
124 } 125 }
125} 126}
126 127
@@ -136,6 +137,7 @@ situation <<beachCenter>>
136 } 137 }
137 enter 138 enter
138 { 139 {
140
139 } 141 }
140} 142}
141 143
diff --git a/src/parser.l b/src/parser.l
index 7957c53..7ceee0a 100644
--- a/src/parser.l
+++ b/src/parser.l
@@ -42,6 +42,7 @@ if { return tokIf; }
42then { return tokThen; } 42then { return tokThen; }
43else { return tokElse; } 43else { return tokElse; }
44command { return tokCommand; } 44command { return tokCommand; }
45option { return tokOption; }
45goto { return tokGoto; } 46goto { return tokGoto; }
46not { return tokNot; } 47not { return tokNot; }
47setup { return tokSetup; } 48setup { return tokSetup; }
@@ -49,6 +50,7 @@ enter { return tokEnter; }
49and { return tokAnd; } 50and { return tokAnd; }
50or { return tokOr; } 51or { return tokOr; }
51return { return tokReturn; } 52return { return tokReturn; }
53ignore { return tokIgnore; }
52 54
53true { yylval->bValue = true; return tokBool; } 55true { yylval->bValue = true; return tokBool; }
54false { yylval->bValue = false; return tokBool; } 56false { yylval->bValue = false; return tokBool; }
diff --git a/src/parser.y b/src/parser.y
index 2aff29c..e127627 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -58,11 +58,13 @@ void yyerror( YYLTYPE *llocp, yyscan_t yyscanner, GameBuilder &, const char *err
58%token tokElse 58%token tokElse
59%token tokNot 59%token tokNot
60%token tokCommand 60%token tokCommand
61%token tokOption
61%token tokPlayer 62%token tokPlayer
62%token tokLtEq 63%token tokLtEq
63%token tokGtEq 64%token tokGtEq
64%token tokCmp 65%token tokCmp
65%token tokReturn 66%token tokReturn
67%token tokIgnore
66%token tokPlusAssign 68%token tokPlusAssign
67%token tokMinusAssign 69%token tokMinusAssign
68%token tokTimesAssign 70%token tokTimesAssign
@@ -108,6 +110,7 @@ globalExprList:
108 110
109cmpltGlobalExpr: globalExpr ';' 111cmpltGlobalExpr: globalExpr ';'
110 | commandDecl 112 | commandDecl
113 | ignoreDecl
111 ; 114 ;
112 115
113globalExpr: tokIdent '=' expr 116globalExpr: tokIdent '=' expr
@@ -118,12 +121,19 @@ bodyDecl:
118 | bodyDecl function 121 | bodyDecl function
119 ; 122 ;
120 123
121situation: tokSituation tokSituationName { bld.beginSituation( *($2) ); } '{' situationMembers '}' { bld.endSituation(); } 124situationMode: tokSituation tokSituationName { bld.beginSituation( *($2) ); }
125 | tokCommand tokSituation tokSituationName { bld.beginSituation( *($2) ); }
126 | tokOption tokSituation tokSituationName { bld.beginSituation( *($2) ); }
127 ;
128
129situation: situationMode '{' situationMembers '}' { bld.endSituation(); }
122 ; 130 ;
123 131
124situationMembers: 132situationMembers:
125 | situationMembers situationModeFunc 133 | situationMembers situationModeFunc
126 | situationMembers commandDecl 134 | situationMembers commandDecl
135 | situationMembers optionDecl
136 | situationMembers ignoreDecl
127 ; 137 ;
128 138
129situationModeFunc: situationMode '{' cmpltExprList '}' { 139situationModeFunc: situationMode '{' cmpltExprList '}' {
@@ -274,6 +284,9 @@ dictValues: expr ':' expr { bld.addNode( AstNode::tInsert ); }
274 | dictValues ',' expr ':' expr { bld.addNode( AstNode::tInsert ); } 284 | dictValues ',' expr ':' expr { bld.addNode( AstNode::tInsert ); }
275 ; 285 ;
276 286
287optionDecl: tokOption ':' tokString '{' cmpltExprList '}'
288 ;
289
277commandDecl: tokCommand ':' tokString { bld.beginCommand( *$3 ); } 290commandDecl: tokCommand ':' tokString { bld.beginCommand( *$3 ); }
278 commandParamList '{' { bld.endCommandParams(); } cmpltExprList '}' { bld.closeCommand(); } 291 commandParamList '{' { bld.endCommandParams(); } cmpltExprList '}' { bld.closeCommand(); }
279 ; 292 ;
@@ -282,6 +295,13 @@ commandParamList:
282 | commandParamList tokString { bld.addCommandLiteral( *$2 ); } 295 | commandParamList tokString { bld.addCommandLiteral( *$2 ); }
283 | commandParamList tokIdent { bld.addCommandParam( *$2 ); } 296 | commandParamList tokIdent { bld.addCommandParam( *$2 ); }
284 ; 297 ;
298
299ignoreDecl: tokIgnore ':' tokString ignoreList ';'
300 ;
301
302ignoreList:
303 | ignoreList tokString
304 ;
285%% 305%%
286/* 306/*
287void yylex_init( yyscan_t * ); 307void yylex_init( yyscan_t * );
diff --git a/support/vim/syntax/stage.vim b/support/vim/syntax/stage.vim
index 45e1346..13d86b4 100644
--- a/support/vim/syntax/stage.vim
+++ b/support/vim/syntax/stage.vim
@@ -19,7 +19,7 @@ syn keyword Statement setup enter
19syn keyword Todo TODO FIXME XXX 19syn keyword Todo TODO FIXME XXX
20syn keyword Type function command situation game global player 20syn keyword Type function command situation game global player
21syn keyword Constant null true false 21syn keyword Constant null true false
22syn keyword Builtins display goto exists delete exit return random integer float 22syn keyword Builtins display goto exists delete exit return random integer float string debugString keys join
23 23
24syn cluster CommentGroup contains=Todo 24syn cluster CommentGroup contains=Todo
25 25