Error: Syntax error @ Symbol: PARSER (unknown:19/-5(-1) - unknown:19/1(-1))
Error : Internal error: Unexpected exception
Exception in thread "main" java.lang.NullPointerException
at java_cup.runtime.lr_parser.symbl_name_from_id(lr_parser.java:456)
at java_cup.runtime.lr_parser.report_expected_token_ids(lr_parser.java:446)
at java_cup.runtime.lr_parser.syntax_error(lr_parser.java:433)
at java_cup.runtime.lr_parser.parse(lr_parser.java:725)
at java_cup.Main.parse_grammar_spec(Main.java:496)
at java_cup.Main.main(Main.java:196)
Это происходит во время компиляции грамматики, а не во время выполнения.
CUP не сообщает о настоящей синтаксической ошибке и запускает NPE внутри symbl_name_from_id, что затрудняет обнаружение проблемы.
Ниже приведена точная грамматика .cup, которую я компилирую:
за которым следует исключение NullPointerException в symbl_name_from_id?
Как я могу определить настоящую синтаксическую проблему внутри этой грамматики?
Любые рекомендации по отладке или указатель на вероятную неработоспособность продукта будут очень признательны.
Я работаю над анализатором DSL, используя [b]Java CUP[/b], и получаю следующую ошибку при попытке скомпилировать грамматику .cup: [code]Error: Syntax error @ Symbol: PARSER (unknown:19/-5(-1) - unknown:19/1(-1)) Error : Internal error: Unexpected exception Exception in thread "main" java.lang.NullPointerException at java_cup.runtime.lr_parser.symbl_name_from_id(lr_parser.java:456) at java_cup.runtime.lr_parser.report_expected_token_ids(lr_parser.java:446) at java_cup.runtime.lr_parser.syntax_error(lr_parser.java:433) at java_cup.runtime.lr_parser.parse(lr_parser.java:725) at java_cup.Main.parse_grammar_spec(Main.java:496) at java_cup.Main.main(Main.java:196) [/code] Это происходит [b]во время компиляции грамматики[/b], а не во время выполнения.
CUP не сообщает о настоящей синтаксической ошибке и запускает NPE внутри symbl_name_from_id, что затрудняет обнаружение проблемы. Ниже приведена точная грамматика .cup, которую я компилирую: [code]package edu.uelbosque.dsl.parser;
Measure ::= LBRACE KW_MEDIDA COLON STRING RBRACE {: RESULT = new Measure($4); :} ;
Education ::= LBRACE KW_EDUCACION COLON STRING RBRACE {: RESULT = new Education($4); :} ;
Task ::= LBRACE KW_TAREA COLON STRING RBRACE {: RESULT = new Task($4); :} ;
OrderMed ::= LBRACE KW_ORDEN_MED COLON Obj OrderMedTail RBRACE {: RESULT = new OrderMed($4, $5); :} | LBRACE KW_ORDEN_MED COLON Obj RBRACE {: RESULT = new OrderMed($4, null); :} ;
OrderMedTail ::= COMMA KW_SEGURIDAD COLON CondList {: RESULT = new OrderMedTail($4); :} ;
FollowUp ::= LBRACE KW_SEGUIMIENTO COLON Obj RBRACE {: RESULT = new FollowUp($4); :} ;
AdjustDose ::= LBRACE KW_AJUSTE_DOSIS COLON Obj RBRACE {: RESULT = new AdjustDose($4); :} ;
AddMed ::= LBRACE KW_AGREGAR_MED COLON Obj RBRACE {: RESULT = new AddMed($4); :} ;
Labs ::= LBRACE KW_LABS COLON StringList RBRACE {: RESULT = new Labs($4); :} ;
GlobalAlerts ::= KW_ALERTAS_GLOBALES COLON LSQUARE AlertList RSQUARE {: RESULT = new GlobalAlerts($4); :} | KW_ALERTAS_GLOBALES COLON LSQUARE RSQUARE {: RESULT = new GlobalAlerts(null); :} ;
AlertList ::= Alert {: RESULT = new AlertList($1); :} | Alert COMMA AlertList {: RESULT = $3.prepend($1); :} ;
Alert ::= Expr ARROW STRING {: RESULT = new Alert($1, $3); :} | KW_INTERACCION COLON STRING ARROW STRING {: RESULT = new AlertInteraction($3, $5); :} ;
Obj ::= LBRACE Pairs RBRACE {: RESULT = new Obj($2); :} | LBRACE RBRACE {: RESULT = new Obj(null); :} ;
Pairs ::= Pair {: RESULT = new Pairs($1); :} | Pair COMMA Pairs {: RESULT = $3.prepend($1); :} ;
Pair ::= Key COLON Value {: RESULT = new Pair($1, $3); :} ;
Key ::= IDENT {: RESULT = new Key($1); :} | KW_AUTOR {: RESULT = new Key($1); :} | KW_VERSION {: RESULT = new Key($1); :} | KW_VIGENCIA {: RESULT = new Key($1); :} | KW_EVIDENCIA {: RESULT = new Key($1); :} ;
Value ::= STRING {: RESULT = new Value($1); :} | NUMBER {: RESULT = new Value($1); :} | BOOLEAN {: RESULT = new Value($1); :} | Obj {: RESULT = new Value($1); :} | List {: RESULT = new Value($1); :} ;
List ::= LSQUARE Values RSQUARE {: RESULT = new List($2); :} | LSQUARE RSQUARE {: RESULT = new List(null); :} ;
Values ::= Value {: RESULT = new Values($1); :} | Value COMMA Values {: RESULT = $3.prepend($1); :} ;
StringList ::= LSQUARE Strings RSQUARE {: RESULT = new StringList($2); :} | LSQUARE RSQUARE {: RESULT = new StringList(null); :} ;
Strings ::= STRING {: RESULT = new Strings($1); :} | STRING COMMA Strings {: RESULT = $3.prepend($1); :} ;
CondList ::= LSQUARE Exprs RSQUARE {: RESULT = new CondList($2); :} | LSQUARE RSQUARE {: RESULT = new CondList(null); :} ;
Exprs ::= Expr {: RESULT = new Exprs($1); :} | Expr COMMA Exprs {: RESULT = $3.prepend($1); :} ;
Expr ::= OrExpr {: RESULT = $1; :} ;
OrExpr ::= AndExpr {: RESULT = $1; :} | AndExpr OR OrExpr {: RESULT = new OrExpr($1, $3); :} ;
AndExpr ::= RelExpr {: RESULT = $1; :} | RelExpr AND AndExpr {: RESULT = new AndExpr($1, $3); :} ;
RelExpr ::= Primary {: RESULT = $1; :} | Primary EQ Primary {: RESULT = new RelExpr($1, "==", $3); :} | Primary LT Primary {: RESULT = new RelExpr($1, "", $3); :} | Primary LE Primary {: RESULT = new RelExpr($1, "=", $3); :} ;
Primary ::= NUMBER {: RESULT = new Primary($1); :} | STRING {: RESULT = new Primary($1); :} | BOOLEAN {: RESULT = new Primary($1); :} | CallOrIdent {: RESULT = $1; :} | OPEN_BRACKET Expr CLOSE_BRACKET {: RESULT = $2; :} ;
CallOrIdent ::= IdentChain CallTail {: RESULT = new CallOrIdent($1, $2); :} | IdentChain {: RESULT = new CallOrIdent($1, null); :} ;
CallTail ::= OPEN_BRACKET ArgList CLOSE_BRACKET {: RESULT = new CallTail($2); :} | OPEN_BRACKET CLOSE_BRACKET {: RESULT = new CallTail(null); :} ;
IdentChain ::= IDENT {: RESULT = new IdentChain($1); :} | IDENT DOT IdentChain {: RESULT = $3.prepend($1); :} ;
ArgList ::= Expr {: RESULT = new ArgList($1); :} | Expr COMMA ArgList {: RESULT = $3.prepend($1); :} ;
[/code] Что я пробовал: [list] [*]Проверил, что все терминалы и нетерминалы объявлены.
[*]Проверил, что все блоки действий {: : сбалансированы.
[*]Проверено на отсутствие точек с запятой или запятых в рабочей среде списки.
[*]Пытался запустить CUP с -expect 1, чтобы получать более качественные сообщения.
[*]Переименовал некоторые нетерминалы (например, List, Document), чтобы избежать коллизий, но ошибка сохраняется.
[/list] Какие проблемы с грамматикой возникают? CUP выпустит: [list] [*][code]Syntax error @ Symbol: PARSER[/code]
[*]за которым следует исключение NullPointerException в symbl_name_from_id?
[/list] Как я могу определить настоящую синтаксическую проблему внутри этой грамматики? Любые рекомендации по отладке или указатель на вероятную неработоспособность продукта будут очень признательны.