From a2f69216775cf3895e5993f879b83dae4fc08767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vanja=20Stojanovi=C4=87?= Date: Thu, 16 Mar 2023 17:08:55 +0100 Subject: [PATCH] Fixed parser, problem was again in if statement, specifically in if_then --- .vscode/launch.json | 2 +- TestsRunner/tests/2-parser.tst | 15 ++++++++++++- src/compiler/parser/Parser.java | 8 ++++--- test4.pns | 39 +++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 test4.pns diff --git a/.vscode/launch.json b/.vscode/launch.json index 23fa8bb..436512d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -24,7 +24,7 @@ "request": "launch", "mainClass": "Main", "projectName": "PINS-compiler_7d951449", - "args": "PINS --exec SYN --dump SYN test3.pns" + "args": "PINS --exec SYN --dump SYN test4.pns" } ] } \ No newline at end of file diff --git a/TestsRunner/tests/2-parser.tst b/TestsRunner/tests/2-parser.tst index 9632d76..9ccc2ec 100644 --- a/TestsRunner/tests/2-parser.tst +++ b/TestsRunner/tests/2-parser.tst @@ -89,4 +89,17 @@ expression_1 -> ε definitions_1 -> ε !end - +!name: Function with while, for and if statement +!code: +fun prestejCrke (i:integer): integer = { + while (i < j[2]): + { + for i = 10, i < 100, i + 1: + { + if i == 69 then print(i) + } + } +} +!expected: +source -> definitions +definitions -> definition definitions_1 diff --git a/src/compiler/parser/Parser.java b/src/compiler/parser/Parser.java index 44f30a3..e85acc6 100644 --- a/src/compiler/parser/Parser.java +++ b/src/compiler/parser/Parser.java @@ -413,6 +413,7 @@ private void parseAtomExpression(ListIterator lexicalSymbol) { parseAtomExpressionLBrace(lexicalSymbol); break; default: + lexicalSymbol.previous(); break; } } @@ -433,9 +434,9 @@ private void parseAtomExpressionLBrace(ListIterator lexicalSymbol) { dump("if_else -> else expression"); lexicalSymbol.previous(); parseIfElse(lexicalSymbol); - } else + currentLexicalSym = lexicalSymbol.next(); + } else dump("if_else -> ε"); - currentLexicalSym = lexicalSymbol.next(); if (currentLexicalSym.tokenType != TokenType.OP_RBRACE) Report.error(currentLexicalSym.position, "The if statment should be closed with a right brace"); break; @@ -447,7 +448,7 @@ private void parseAtomExpressionLBrace(ListIterator lexicalSymbol) { Report.error(currentLexicalSym.position, "After while condition a colon should follow"); parseExpression(lexicalSymbol); currentLexicalSym = lexicalSymbol.next(); - if (currentLexicalSym.tokenType != TokenType.OP_LBRACE) + if (currentLexicalSym.tokenType != TokenType.OP_RBRACE) Report.error(currentLexicalSym.position, "After while body expression a right brace should close it"); break; @@ -483,6 +484,7 @@ private void parseAtomExpressionLBrace(ListIterator lexicalSymbol) { break; default: dump("atom_expression_lbrace_1 -> expression \'=\' expression \'}\'"); + lexicalSymbol.previous(); parseExpression(lexicalSymbol); currentLexicalSym = lexicalSymbol.next(); if (currentLexicalSym.tokenType != TokenType.OP_ASSIGN) diff --git a/test4.pns b/test4.pns new file mode 100644 index 0000000..4ed43a8 --- /dev/null +++ b/test4.pns @@ -0,0 +1,39 @@ +typ prvic:string; +typ drugic : integer; +typ tretjic : besedilo; +typ cetrtic: arr[7] arr[7] logical; +var petic : arr [ 10 ] integer; + +fun prvaFunkcija (prvic:string, drugic:integer, cetrtic:arr[7] logical) : integer = +5 + 3 - 2 == 10 & true | beseda / drugabeseda * 'danesjelepdanaaaaa' % cetrtic != petic + 5 - !e +- (-10) + (+(+(-10))) / (!cetrtic) + 100 - false | nekaj & nekaj == bla | nekaj >= blabla & +nekaj <= blablabla | nekaj + nekaj < bla & nekaj - nekaj > nekajbla { where + fun drugaFunkcija(nekaj:integer):integer= + { + { if haha then { + if nekaj then 5+3-1-4+2 * true else { + while nekaj >= nekaj * (-5323223) + -44545 : { + for nekaj = 1, nekaj >= -9999999, nekajnekaj-1-1-1-1:nekaj + } + } + } + } + = celotenprogramtideluje69 { where + fun epicBubblesort(polje:arr[10]integer):void = + n == dolzinaPolja & + temp == 0 & { + for i=0,i polje[j] then + temp == polje[j-1] & + polje[j-1] == polje[j] & + polje[j] == temp & + blablabla #neki komentarji + } + } + } + } + } + } +#lololololol \ No newline at end of file