Новая строка как пробел и терминатор - PullRequest
0 голосов
/ 21 ноября 2018

Я разбираю javascript ES6, однако не могу заставить его работать без точек с запятой.Я использовал грамматику Тина из ES5 в качестве основы (https://github.com/usethesource/rascal/blob/master/src/org/rascalmpl/library/lang/javascript/saner/Syntax.rsc) и уже получил большинство новых функций от ES6, но я до сих пор не могу устранить необходимость в точках с запятой

Взять, например:

lexical Whitespace
   = [\t-\n\r\ ];

lexical LAYOUT
  = Whitespace
  | Comment
  ;

layout LAYOUTLIST
  = LAYOUT*
  !>> [\t\ \n]
  !>> "/*"
  !>> "//" ;


syntax Variable
  = VariableIdentifier {VariableDeclaration ","}+ declarations ";"

syntax Statement 
  = varDecl: Variable varDecl;

Я получаю ошибку синтаксического анализа, заменив ";"в "\ n" в синтаксической переменной или даже в создании нового правила для конца оператора:

syntax EOS
= ";" | "\n";

Ошибка синтаксического анализа переходит на следующую строку после новой строки.

Удаление из пробеловили из раскладки выдает ошибку синтаксического анализа комментариев в начале файла.

А удаление из списка макетов дает мне двусмысленность.

1 Ответ

0 голосов
/ 28 декабря 2018

, учитывая меньший язык, я имею дело с этой проблемой (концом оператора может быть «;», «\ n» или конец файла), используя:

syntax EOS = ";"             // handle ";" as end of statement
           | Epsilon $       // handle "\n" and EOF as end of statement
           | Epsilon >> "}"  // it might be also necessary (from ANTLR grammar) 
           ;  
syntax Epsilon = ;

//and a test case
test bool testParseEOS() {
   try {
     parse(#BlockStmt, "{x := x + 1; y := 10 \n y := z + 1; x := z  }");
     return true;
   }
   catch ParseError(loc l): {
     println("I found a parse error at line <l.begin.line>, column <l.begin.column>"); 
     return false; 
   }
}
...