Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ANTLR输入不匹配';NUM';应为{…,';NUM';}_Java_Grammar_Antlr4 - Fatal编程技术网

Java ANTLR输入不匹配';NUM';应为{…,';NUM';}

Java ANTLR输入不匹配';NUM';应为{…,';NUM';},java,grammar,antlr4,Java,Grammar,Antlr4,我在尝试解析文件时遇到了ANTLR4问题。它一开始是有效的,但在我的语法中添加了以下内容后,我得到了一个错误(见下文): 我的语言中的'NUM'关键字符合以下规则: typePrefix: type=('NUM' | 'BOOL' | 'STRING' | 'COORD' | 'LIST'); 我的所有其他类型前缀也有同样的问题,但我猜这对所有类型前缀都是相同的解决方案 我试图用TYPE_NUM、TYPE_BOOL等替换typePrefix规则的所有选项,但这似乎不起作用 编辑: 根据评论中的

我在尝试解析文件时遇到了ANTLR4问题。它一开始是有效的,但在我的语法中添加了以下内容后,我得到了一个错误(见下文):

我的语言中的'NUM'关键字符合以下规则:

typePrefix: type=('NUM' | 'BOOL' | 'STRING' | 'COORD' | 'LIST');
我的所有其他类型前缀也有同样的问题,但我猜这对所有类型前缀都是相同的解决方案

我试图用TYPE_NUM、TYPE_BOOL等替换typePrefix规则的所有选项,但这似乎不起作用

编辑: 根据评论中的要求,我发布了语法中使用“NUM”的部分:

prog
    :   roboDcl loads roboBodyDcl;
loads
    :   recursion=loads 'LOAD' '(' load_id=StringLit ')' '\n' 
    |   //lambda
    ;
memberDcl
    :   dcl=fieldDcl
    |   met_dcl=methodDcl
    |   '\n'
    ;
roboDcl
    :   id=Identifier':''\n'
    ;
roboBodyDcl
    :   recursion=roboBodyDcl dcl=memberDcl
    |   dcl=memberDcl   
    ;
fieldDcl
    :   t=typePrefix dcl_list=variableDclList '\n';
typePrefix
    :   type=('NUM' | 'BOOL' | 'STRING' | 'COORD' | 'LIST');
variableDclList
    :   single=variableDcl
    |   list=variableDclList ',' single=variableDcl
    ;
variableDcl
    :   var_init=variableInitializer
    |   id=Identifier '=' list_init=listInitializer
    ;
variableInitializer 
    :   expr=assignmentExpression
    ;
TYPE_NUM: 'NUM';
TYPE_STRING: 'STRING';
TYPE_COORD: 'COORD';
TYPE_BOOL: 'BOOL';
TYPE_VOID: 'VOID';
TYPE_LIST: 'LIST';
如前所述,我尝试用以下内容替换typePrefix规则:

typePrefix
    :    type=(TYPE_NUM | TYPE_BOOL | TYPE_STRING | TYPE_COORD | TYPE_LIST);

我希望这将足够,并提前感谢

我找到了问题所在,并将尝试提供一个解释,以防有人遇到同样的情况

如前所述,“最终Antlr 4参考”Antlr通过选择首先定义的规则来解决lexer规则中的歧义。并声明“这意味着您的ID规则应该在所有关键字规则之后定义…”

就我而言,我用以下方式定义了我的语法:

fragment NameStartChar
    :       'A'..'Z' | 'a'..'z';
fragment NameChar
    :       NameStartChar
    |       Num
    |       '_'
    ;
fragment Num
    :       '0'..'9';
Identifier
    :   NameStartChar NameChar*;
TYPE_NUM: 'NUM';
这最终匹配了我所有的关键字“NUM”、“BOOL”等等

因此,解决方案是将标识符规则定义为lexer规则的最后一个。下面可以看到一个示例:

fragment NameStartChar
    :       'A'..'Z' | 'a'..'z';
fragment NameChar
    :       NameStartChar
    |       Num
    |       '_'
    ;
fragment Num
    :       '0'..'9';
TYPE_NUM: 'NUM';
//All other keyword definitions ('BOOL', 'STRING' and so alike)
Identifier
    :   NameStartChar NameChar*

请发布更多信息,如果可能,完整语法。我是否正确地理解了您已经两次指定了'NUM'literal?一次为TYPE_NUM,然后为typePrefix?谢谢您的回复。是的,它被指定了两次是正确的,但正如我所写的,如果我用TYPE_NUM替换typePrefix中的'NUM',它不会改变任何事情。语法很长,但我将提供声明部分,希望它足够:\n
fieldDcl:t=typePrefix dcl_list=variableDclList'\n';variabledclist:single=variableDcl | list=variabledclist','single=variableDcl;variableDcl:var_init=variableInitializer;variableInitializer:expr=assignmentExpression
你说它太长了,无法发布,但是在评论中添加了它,这很难阅读。请编辑您的问题。如果它真的那么长,你可以把任何东西放进github/dropbox并共享链接
fragment NameStartChar
    :       'A'..'Z' | 'a'..'z';
fragment NameChar
    :       NameStartChar
    |       Num
    |       '_'
    ;
fragment Num
    :       '0'..'9';
TYPE_NUM: 'NUM';
//All other keyword definitions ('BOOL', 'STRING' and so alike)
Identifier
    :   NameStartChar NameChar*