aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_lemon_yaccer.y
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--LuaSL/src/LuaSL_lemon_yaccer.y103
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
14program ::= 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.
18expr(A) ::= expr(B) LSL_BOOL_AND(D) expr(C). { A = addOperation(D, D->token->type, B, C); }
19%left LSL_BOOL_OR.
20expr(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.
22expr(A) ::= expr(B) LSL_BIT_OR(D) expr(C). { A = addOperation(D, LSL_BIT_OR, B, C); }
23expr(A) ::= expr(B) LSL_BIT_XOR(D) expr(C). { A = addOperation(D, LSL_BIT_XOR, B, C); }
24expr(A) ::= expr(B) LSL_BIT_AND(D) expr(C). { A = addOperation(D, LSL_BIT_AND, B, C); }
25%left LSL_EQUAL LSL_NOT_EQUAL.
26expr(A) ::= expr(B) LSL_NOT_EQUAL(D) expr(C). { A = addOperation(D, LSL_NOT_EQUAL, B, C); }
27expr(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.
29expr(A) ::= expr(B) LSL_GREATER_EQUAL(D) expr(C). { A = addOperation(D, LSL_GREATER_EQUAL, B, C); }
30expr(A) ::= expr(B) LSL_LESS_EQUAL(D) expr(C). { A = addOperation(D, LSL_LESS_EQUAL, B, C); }
31expr(A) ::= expr(B) LSL_GREATER_THAN(D) expr(C). { A = addOperation(D, LSL_GREATER_THAN, B, C); }
32expr(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.
34expr(A) ::= expr(B) LSL_RIGHT_SHIFT(D) expr(C). { A = addOperation(D, LSL_RIGHT_SHIFT, B, C); }
35expr(A) ::= expr(B) LSL_LEFT_SHIFT(D) expr(C). { A = addOperation(D, LSL_LEFT_SHIFT, B, C); }
36%left LSL_SUBTRACT LSL_ADD.
37expr(A) ::= expr(B) LSL_ADD(D) expr(C). { A = addOperation(D, LSL_ADD, B, C); }
38expr(A) ::= expr(B) LSL_SUBTRACT(D) expr(C). { A = addOperation(D, LSL_SUBTRACT, B, C); }
39%left LSL_DIVIDE LSL_MODULO LSL_MULTIPLY.
40expr(A) ::= expr(B) LSL_MULTIPLY(D) expr(C). { A = addOperation(D, LSL_MULTIPLY, B, C); }
41expr(A) ::= expr(B) LSL_MODULO(D) expr(C). { A = addOperation(D, LSL_MODULO, B, C); }
42expr(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.
44expr(A) ::= LSL_BIT_NOT(D) expr(B). { A = addOperation(D, LSL_BIT_NOT, NULL, B); }
45expr(A) ::= LSL_BOOL_NOT(D) expr(B). { A = addOperation(D, LSL_BOOL_NOT, NULL, B); }
46expr(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.
50expr(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.
58expr(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.
69statement(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.
72script ::= script statement(A). { A->left = param->ast; param->ast = A; }
73script ::= 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