Merge pull request #177 from biveraxe/ver4dev

Исправляем баг с фигурными скобками
This commit is contained in:
2022-08-30 23:32:22 +03:00
committed by GitHub
2 changed files with 15 additions and 7 deletions

View File

@@ -19,6 +19,7 @@ class IoTScenario {
String IdentifierStr; // Заполняется, если tok_identifier String IdentifierStr; // Заполняется, если tok_identifier
float NumVal; // Заполняется, если tok_number float NumVal; // Заполняется, если tok_number
int LastChar; int LastChar;
int curLine;
/// gettok - Возвращает следующий токен из стандартного потока ввода. /// gettok - Возвращает следующий токен из стандартного потока ввода.
int gettok(); int gettok();

View File

@@ -467,7 +467,7 @@ class SysCallExprAST : public ExprAST {
} }
IoTValue *exec() { IoTValue *exec() {
Serial.printf("Call from SysCallExprAST exec %d\n", operation); //Serial.printf("Call from SysCallExprAST exec %d\n", operation);
if (isIotScenException) return nullptr; // если прерывание, то сразу выходим if (isIotScenException) return nullptr; // если прерывание, то сразу выходим
@@ -586,8 +586,11 @@ class BracketsExprAST : public ExprAST {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
int IoTScenario::getLastChar() { int IoTScenario::getLastChar() {
if (file) return file.read(); if (file) {
else return EOF; LastChar = file.read();
if (LastChar == 10) curLine++;
return LastChar;
} else return EOF;
} }
/// gettok - Возвращает следующий токен из стандартного потока ввода. /// gettok - Возвращает следующий токен из стандартного потока ввода.
@@ -712,7 +715,7 @@ int IoTScenario::GetTokPrecedence() {
/// Error* - Это небольшие вспомогательные функции для обработки ошибок. /// Error* - Это небольшие вспомогательные функции для обработки ошибок.
ExprAST *IoTScenario::Error(const char *Str) { ExprAST *IoTScenario::Error(const char *Str) {
Serial.printf("Error: %s\n", Str); Serial.printf("Scenario error in line %d: %s\n", curLine-1, Str);
return nullptr; return nullptr;
} }
@@ -781,7 +784,7 @@ ExprAST *IoTScenario::ParseParenExpr() {
if (CurTok != ')') if (CurTok != ')')
return Error("expected ')'"); return Error("expected ')'");
getNextToken(); // получаем ). //getNextToken(); // получаем ).
return V; return V;
} }
@@ -807,7 +810,7 @@ ExprAST *IoTScenario::ParseBracketsExpr() {
} }
} }
getNextToken(); // получаем }. //getNextToken(); // получаем }.
return new BracketsExprAST(bracketsList); return new BracketsExprAST(bracketsList);
} }
@@ -930,13 +933,17 @@ void IoTScenario::exec(String eventIdName) { // посимвольно счит
LastChar = 0; LastChar = 0;
CurTok = 0; CurTok = 0;
file.seek(0); file.seek(0);
curLine = 1;
while ((getNextToken()) != EOF) { while ((getNextToken()) != EOF) {
switch (CurTok) { switch (CurTok) {
case tok_if: { case tok_if: {
IDNames = ""; // сбрасываем накопитель встречающихся идентификаторов в условии IDNames = ""; // сбрасываем накопитель встречающихся идентификаторов в условии
ExprAST *tmpAST = ParseIfExpr(&IDNames); ExprAST *tmpAST = ParseIfExpr(&IDNames);
if (!tmpAST) break; if (!tmpAST) {
Error("IF Expr wrong.");
break;
}
if (tmpAST->hasEventIdName(eventIdName)) { if (tmpAST->hasEventIdName(eventIdName)) {
tmpAST->exec(); tmpAST->exec();