0

我正在尝试为 C 的一个子集编写一个解析器。

在这种简单(进一步简化)的语法上很难分析树顶的行为。

 grammar Shyc

 rule functionDef
    type space identifier '('  ')' bloc
 end

 rule type
    'int'
 end

 rule bloc
    '{'  '}' 
 end

 rule identifier
    [a-zA-Z] [a-zA-Z_]*
 end

 rule space
   [\s]+
 end

end

我的测试用例是“int main(){}”

来自树顶的错误消息是:

error at line 1, column 9
failure reason : Expected [a-zA-Z_] at line 1, column 9 (byte 9) after 
compiler.rb:25:in `parse': Parse error (RuntimeError)
from compiler.rb:73:in `<main>'enter 

因此,问题在于标识符规则......

树顶的版本:1.5.3 和 Ruby 2.1.1

任何想法 ?

4

1 回答 1

0

问题是我的测试用例在一个单独的文件中,最后有一个补充的行尾 \n ,并且这里测试的语法没有指定如何使用它。

这是解决问题的代码。正如此处在 Treetop 的邮件列表中所讨论的那样,该错误很奇怪,并且在某种程度上具有误导性,但通常很难自动发出清晰的消息。

grammar Shyc

rule functionDef
   type space identifier '('  ')' bloc space?
end

rule type
  'int'
end

rule bloc
  '{'  '}' 
end

rule identifier
   [a-zA-Z] [a-zA-Z_]*
end

rule space
  [\s\n]+
end

结尾

于 2014-07-12T20:57:12.510 回答