【问题标题】:the if satement does not work with my grammarif 语句不适用于我的语法
【发布时间】:2013-03-07 14:15:55
【问题描述】:

我的 if 语句与我的语法有问题,可以在这里找到 http://sd-g1.archive-host.com/membres/up/24fe084677d7655eb57ba66e1864081450017dd9/CNew.txt。例如,当我输入 Ctrl+D 时:

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

树解析器在 "if(" 处停止,控制台没有说明任何原因。请问有谁知道问题出在哪里?

【问题讨论】:

  • 对不起,我忘了说,是的,它在 C 中。
  • 你能发布你的编译器和错误吗?
  • 这是我所拥有的 i.imgur.com/8bvmxL6.png ,但控制台没有说明任何错误。就这样停止了。

标签: c if-statement antlr grammar antlrworks


【解决方案1】:

假设语法的入口点是translation_unit,看起来解析器在匹配单个external_declaration 后就停止了。尝试在该规则的末尾添加EOF(文件结尾)标记,以便强制解析器匹配整个输入:

translation_unit
    : external_declaration+ EOF
    ;

但是,我看不出external_declaration 将如何匹配您语法中的if 语句(selection_statement)。也许您想在您的external_declaration 中添加statement

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

external_declaration
    : function_definition
    | declaration
    | statement
    ;

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

【讨论】:

  • 感谢您的回答,但 EOF 是否也是必须在语法中实现的词法分析器规则?因为如果我只添加这个我有这些错误 [16:40:00] 警告(105):CNew.g:35:28:没有对应于令牌的词法分析器规则:E [16:40:19] 注意:C:\ output\CNewParser.java 使用未经检查或不安全的操作。 [16:40:19] 注意:使用 -Xlint 重新编译:详细信息未选中。
  • 当我在 translation_unit 的末尾添加 EOF 时,我得到了之前提到的错误,但是从 translation_unit 有一个新的孩子是“MissingTokenException(at if)”
  • 当我将EOF 添加到your grammartranslation_unit 时,我没有收到“没有对应于令牌的词法分析器规则” 之类的错误。如果你这样做了,那么你就没有使用你在问题中链接到的语法。 还有另一个错误,但这只是因为external_declaration永远不会匹配selection_statement
  • 至于“无词法分析器规则”,我真的很抱歉,我在写它的时候没有注意到它已经完成(我感到羞耻)。无论如何,再次感谢@Bart Kiers,你是对的,无法从 external_declaration 块访问 selection_statement。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2021-09-28
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多