C if语句不符合我的语法

C if语句不符合我的语法,c,if-statement,antlr,grammar,antlrworks,C,If Statement,Antlr,Grammar,Antlrworks,我的if语句和语法有问题,可以在这里找到。例如,当我在Ctrl+D中键入时: int k = 0; if ( k ==0 ){ return k; } 树解析器在“if”()处停止,控制台没有说明任何原因。有人知道问题可能来自何处吗?假设语法的入口点是translation\u unit,看起来解析器只是在匹配单个外部\u声明后停止。请尝试添加EOF(文件末尾)该规则末尾的标记,以便强制解析器匹配整个输入: translation_unit : externa

我的if语句和语法有问题,可以在这里找到。例如,当我在Ctrl+D中键入时:

  int k = 0;
  if ( k ==0 ){
       return k;
  }

树解析器在“if”()处停止,控制台没有说明任何原因。有人知道问题可能来自何处吗?

假设语法的入口点是
translation\u unit
,看起来解析器只是在匹配单个
外部\u声明后停止。请尝试添加
EOF
(文件末尾)该规则末尾的标记,以便强制解析器匹配整个输入:

translation_unit
    : external_declaration+ EOF
    ;
但是,我看不出
外部_声明
如何与语法中的
if
-语句(一个
选择_语句
)匹配。也许您想在
外部_声明
中添加一个
语句

translation_unit
scope Symbols; // entire file is a scope
@init {
  $Symbols::types = new HashSet();
}
    : (external_declaration)+ EOF
    ;

external_declaration
    : function_definition
    | declaration
    | statement
    ;

之后,您的输入将得到正确的解析。

假设语法的入口点是
翻译单元
,解析器似乎在匹配单个
外部声明
后就停止了。请尝试添加
EOF
(文件结尾)该规则末尾的标记,以便强制解析器匹配整个输入:

translation_unit
    : external_declaration+ EOF
    ;
但是,我看不出
外部_声明
如何与语法中的
if
-语句(一个
选择_语句
)匹配。也许您想在
外部_声明
中添加一个
语句

translation_unit
scope Symbols; // entire file is a scope
@init {
  $Symbols::types = new HashSet();
}
    : (external_declaration)+ EOF
    ;

external_declaration
    : function_definition
    | declaration
    | statement
    ;

之后,您的输入将被正确解析。

对不起,我忘了说,是的,它是用C写的。您可以发布您的编译器和错误吗?这是我的,但控制台没有说明任何错误。它只是像这样停止。对不起,我忘了说,是的,它是用C写的。您可以发布您的编译器和错误吗?这是我的,但是coNSLE没有声明任何错误。它只是这样停止。感谢您的回答,但EOF也是语法中必须实现的词法规则吗?因为如果我只添加此项,则会出现错误[16:40:00]警告(105):CNew.g:35:28:没有对应于令牌的词法规则:E[16:40:19]注意:C:\output\CNewParser.java使用未经检查或不安全的操作。[16:40:19]注意:使用-Xlint:unchecked重新编译以了解详细信息。当我在翻译单元末尾添加EOF时,我会收到前面提到的错误,但翻译单元中有一个新的子项,它是“MissingTokenException(at if)”当我将
EOF
添加到的
translation\u unit
时,我没有得到类似“没有对应于令牌的lexer规则”的错误。如果你这样做,那么你没有使用你在问题中链接到的语法。虽然还有另一个错误,但那只是因为
external\u声明
永远不会与
selection\u语句
匹配。至于“no lexer rule”,我真的很抱歉,我在写它的时候没有注意到它被执行了(我感到羞耻)。无论如何,再次感谢@Bart Kiers,你是对的,无法从外部_声明块访问selection_语句。谢谢你的回答,但EOF是一个必须在语法中实现的lexer规则吗?因为如果我只添加这个,我会出现错误[16:40:00]警告(105):CNew.g:35:28:没有对应于标记的lexer规则:E[16:40:19]注意:C:\output\CNewParser.java使用未经检查或不安全的操作。[16:40:19]注意:使用-Xlint:unchecked重新编译以获取详细信息。当我在translation\u单元的末尾添加EOF a时,我会收到前面提到的错误,但translation\u单元中有一个新的子元素,它是“MissingTokenException(at if)”当我将
EOF
添加到的
translation\u单元
时,我不会得到类似“没有对应于令牌的lexer规则”的错误“。如果你这样做,那么你没有使用你在问题中链接到的语法。虽然还有另一个错误,但那只是因为
外部声明
永远不会与
选择声明
匹配。至于“no lexer rule”,我真的很抱歉,我在写它的时候没有注意到它被执行了(我感到羞耻)。无论如何,再次感谢@Bart Kiers,你是对的。无法从外部_声明块访问selection_语句。