Author: mesyeti <mesyeti@mesyeti.uk>
change the precedence of dot operator
basic/source/parser.c | 48 ++++++++++++++++++++++----------------------
diff --git a/basic/source/parser.c b/basic/source/parser.c index 91481eae18cdc53e93bed8a7d93f99843ef21ee9..9b52e190c69d437e8ba0e61b72ee3ac00f667554 100644 --- a/basic/source/parser.c +++ b/basic/source/parser.c @@ -129,8 +129,29 @@ default: return false; } } +static Node ParseDot(Parser* p) { + Node left = ParseAtom(p); + + while (p->tokens[p->i].type == TOKEN_DOT) { + TokenType op = p->tokens[p->i].type; + Advance(p); + Node right = ParseAtom(p); + + Node* leftPtr = SafeMalloc(sizeof(Node)); + Node* rightPtr = SafeMalloc(sizeof(Node)); + *leftPtr = left; + *rightPtr = right; + + left.bin = (BinaryNode) { + INFO(NODE_BINARY_OP), leftPtr, rightPtr, op + }; + } + + return left; +} + static Node ParseFuncArray(Parser* p) { - Node left = ParseAtom(p); + Node left = ParseDot(p); while ((p->tokens[p->i].type == TOKEN_LPAREN) || (p->tokens[p->i].type == TOKEN_LSQUARE)) { if (p->tokens[p->i].type == TOKEN_LPAREN) { // function call @@ -251,34 +272,13 @@ return left; } -static Node ParseDot(Parser* p) { +static Node ParseAssign(Parser* p) { Node left = ParseComparison(p); - while (p->tokens[p->i].type == TOKEN_DOT) { + while (p->tokens[p->i].type == TOKEN_ASSIGN) { TokenType op = p->tokens[p->i].type; Advance(p); Node right = ParseComparison(p); - - Node* leftPtr = SafeMalloc(sizeof(Node)); - Node* rightPtr = SafeMalloc(sizeof(Node)); - *leftPtr = left; - *rightPtr = right; - - left.bin = (BinaryNode) { - INFO(NODE_BINARY_OP), leftPtr, rightPtr, op - }; - } - - return left; -} - -static Node ParseAssign(Parser* p) { - Node left = ParseDot(p); - - while (p->tokens[p->i].type == TOKEN_ASSIGN) { - TokenType op = p->tokens[p->i].type; - Advance(p); - Node right = ParseDot(p); Node* leftPtr = SafeMalloc(sizeof(Node)); Node* rightPtr = SafeMalloc(sizeof(Node));