diff options
author | David Walter Seikel | 2012-01-12 03:14:17 +1000 |
---|---|---|
committer | David Walter Seikel | 2012-01-12 03:14:17 +1000 |
commit | fc5d487de27aa7aa17502008c848d06758223888 (patch) | |
tree | 8f3007f53f49c146ae6c30a100decd3b3a0af1dd /LuaSL/src/LuaSL_lemon_yaccer.y | |
parent | Leaf cloner. (diff) | |
download | SledjHamr-fc5d487de27aa7aa17502008c848d06758223888.zip SledjHamr-fc5d487de27aa7aa17502008c848d06758223888.tar.gz SledjHamr-fc5d487de27aa7aa17502008c848d06758223888.tar.bz2 SledjHamr-fc5d487de27aa7aa17502008c848d06758223888.tar.xz |
Switch to the lemon parser.
Diffstat (limited to 'LuaSL/src/LuaSL_lemon_yaccer.y')
-rw-r--r-- | LuaSL/src/LuaSL_lemon_yaccer.y | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/LuaSL/src/LuaSL_lemon_yaccer.y b/LuaSL/src/LuaSL_lemon_yaccer.y new file mode 100644 index 0000000..14942b7 --- /dev/null +++ b/LuaSL/src/LuaSL_lemon_yaccer.y | |||
@@ -0,0 +1,103 @@ | |||
1 | %include { | ||
2 | #include "LuaSL_LSL_tree.h" | ||
3 | } | ||
4 | |||
5 | %extra_argument { LuaSL_yyparseParam *param } | ||
6 | |||
7 | %stack_size 256 | ||
8 | |||
9 | %token_type {LSL_Leaf *} | ||
10 | %default_type {LSL_Leaf *} | ||
11 | %token_destructor { burnLeaf($$); } | ||
12 | |||
13 | |||
14 | program ::= script LSL_SCRIPT(A). { A->left = param->ast; param->ast = A; } // Lemon does not like the start symbol to be on the RHS, so give it a dummy one. | ||
15 | |||
16 | |||
17 | %left LSL_BOOL_AND. | ||
18 | expr(A) ::= expr(B) LSL_BOOL_AND(D) expr(C). { A = addOperation(D, D->token->type, B, C); } | ||
19 | %left LSL_BOOL_OR. | ||
20 | expr(A) ::= expr(B) LSL_BOOL_OR(D) expr(C). { A = addOperation(D, LSL_BOOL_OR, B, C); } | ||
21 | %left LSL_BIT_AND LSL_BIT_XOR LSL_BIT_OR. | ||
22 | expr(A) ::= expr(B) LSL_BIT_OR(D) expr(C). { A = addOperation(D, LSL_BIT_OR, B, C); } | ||
23 | expr(A) ::= expr(B) LSL_BIT_XOR(D) expr(C). { A = addOperation(D, LSL_BIT_XOR, B, C); } | ||
24 | expr(A) ::= expr(B) LSL_BIT_AND(D) expr(C). { A = addOperation(D, LSL_BIT_AND, B, C); } | ||
25 | %left LSL_EQUAL LSL_NOT_EQUAL. | ||
26 | expr(A) ::= expr(B) LSL_NOT_EQUAL(D) expr(C). { A = addOperation(D, LSL_NOT_EQUAL, B, C); } | ||
27 | expr(A) ::= expr(B) LSL_EQUAL(D) expr(C). { A = addOperation(D, LSL_EQUAL, B, C); } | ||
28 | %left LSL_LESS_THAN LSL_GREATER_THAN LSL_LESS_EQUAL LSL_GREATER_EQUAL. | ||
29 | expr(A) ::= expr(B) LSL_GREATER_EQUAL(D) expr(C). { A = addOperation(D, LSL_GREATER_EQUAL, B, C); } | ||
30 | expr(A) ::= expr(B) LSL_LESS_EQUAL(D) expr(C). { A = addOperation(D, LSL_LESS_EQUAL, B, C); } | ||
31 | expr(A) ::= expr(B) LSL_GREATER_THAN(D) expr(C). { A = addOperation(D, LSL_GREATER_THAN, B, C); } | ||
32 | expr(A) ::= expr(B) LSL_LESS_THAN(D) expr(C). { A = addOperation(D, LSL_LESS_THAN, B, C); } | ||
33 | %left LSL_LEFT_SHIFT LSL_RIGHT_SHIFT. | ||
34 | expr(A) ::= expr(B) LSL_RIGHT_SHIFT(D) expr(C). { A = addOperation(D, LSL_RIGHT_SHIFT, B, C); } | ||
35 | expr(A) ::= expr(B) LSL_LEFT_SHIFT(D) expr(C). { A = addOperation(D, LSL_LEFT_SHIFT, B, C); } | ||
36 | %left LSL_SUBTRACT LSL_ADD. | ||
37 | expr(A) ::= expr(B) LSL_ADD(D) expr(C). { A = addOperation(D, LSL_ADD, B, C); } | ||
38 | expr(A) ::= expr(B) LSL_SUBTRACT(D) expr(C). { A = addOperation(D, LSL_SUBTRACT, B, C); } | ||
39 | %left LSL_DIVIDE LSL_MODULO LSL_MULTIPLY. | ||
40 | expr(A) ::= expr(B) LSL_MULTIPLY(D) expr(C). { A = addOperation(D, LSL_MULTIPLY, B, C); } | ||
41 | expr(A) ::= expr(B) LSL_MODULO(D) expr(C). { A = addOperation(D, LSL_MODULO, B, C); } | ||
42 | expr(A) ::= expr(B) LSL_DIVIDE(D) expr(C). { A = addOperation(D, LSL_DIVIDE, B, C); } | ||
43 | %right LSL_BIT_NOT LSL_BOOL_NOT LSL_NEGATION. | ||
44 | expr(A) ::= LSL_BIT_NOT(D) expr(B). { A = addOperation(D, LSL_BIT_NOT, NULL, B); } | ||
45 | expr(A) ::= LSL_BOOL_NOT(D) expr(B). { A = addOperation(D, LSL_BOOL_NOT, NULL, B); } | ||
46 | expr(A) ::= LSL_SUBTRACT(D) expr(B). [LSL_NEGATION] { A = addOperation(D, LSL_NEGATION, NULL, B); } | ||
47 | %left LSL_ANGLE_OPEN LSL_ANGLE_CLOSE. | ||
48 | %nonassoc LSL_BRACKET_OPEN LSL_BRACKET_CLOSE. | ||
49 | %nonassoc LSL_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE LSL_EXPRESSION. | ||
50 | expr(A) ::= LSL_PARENTHESIS_OPEN(B) expr(C) LSL_PARENTHESIS_CLOSE(D). { A = addParenthesis(B, C, D); } | ||
51 | %right LSL_ASSIGNMENT_ADD LSL_ASSIGNMENT_SUBTRACT LSL_ASSIGNMENT_MULTIPLY LSL_ASSIGNMENT_MODULO LSL_ASSIGNMENT_DIVIDE LSL_ASSIGNMENT_PLAIN. | ||
52 | %right LSL_DOT. | ||
53 | %right LSL_DECREMENT_PRE LSL_INCREMENT_PRE. | ||
54 | %nonassoc LSL_COMMA. | ||
55 | |||
56 | %nonassoc LSL_FLOAT. | ||
57 | %nonassoc LSL_INTEGER. | ||
58 | expr(A) ::= LSL_INTEGER(B). { A = B; } | ||
59 | |||
60 | %nonassoc LSL_TYPE_FLOAT LSL_TYPE_INTEGER LSL_TYPE_KEY LSL_TYPE_LIST LSL_TYPE_ROTATION LSL_TYPE_STRING LSL_TYPE_VECTOR. | ||
61 | |||
62 | %nonassoc LSL_DO LSL_FOR LSL_ELSE LSL_IF LSL_JUMP LSL_RETURN LSL_STATE_CHANGE LSL_WHILE. | ||
63 | |||
64 | %nonassoc LSL_LABEL. | ||
65 | |||
66 | %nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE. | ||
67 | |||
68 | %nonassoc LSL_STATEMENT. | ||
69 | statement(A) ::= expr(B) LSL_STATEMENT(D). { A = addStatement(D, LSL_EXPRESSION, B); } | ||
70 | |||
71 | %nonassoc LSL_SPACE LSL_COMMENT LSL_COMMENT_LINE LSL_IDENTIFIER LSL_SCRIPT LSL_UNKNOWN. | ||
72 | script ::= script statement(A). { A->left = param->ast; param->ast = A; } | ||
73 | script ::= statement(A). { A->left = param->ast; param->ast = A; } | ||
74 | |||
75 | |||
76 | %parse_accept {printf("Parsing complete.\n");} | ||
77 | |||
78 | %parse_failure { | ||
79 | fprintf(stderr,"Giving up. Parser is hopelessly lost...\n"); | ||
80 | } | ||
81 | |||
82 | %stack_overflow { | ||
83 | fprintf(stderr,"Giving up. Parser stack overflow!\n"); | ||
84 | } | ||
85 | |||
86 | %syntax_error { | ||
87 | fprintf(stderr,"Syntax error!\n"); | ||
88 | } | ||
89 | |||
90 | /* Undocumented shit that might be useful later. Pffft | ||
91 | |||
92 | ** The next table maps tokens into fallback tokens. If a construct | ||
93 | ** like the following: | ||
94 | **. | ||
95 | ** %fallback ID X Y Z. | ||
96 | ** | ||
97 | ** appears in the grammar, then ID becomes a fallback token for X, Y, | ||
98 | ** and Z. Whenever one of the tokens X, Y, or Z is input to the parser | ||
99 | ** but it does not parse, the type of the token is changed to ID and | ||
100 | ** the parse is retried before an error is thrown. | ||
101 | |||
102 | */ | ||
103 | |||