ANTLR不会为简单的计算器语法解析这个简单的输入

时间:2013-04-08 22:15:50

标签: parsing grammar calculator antlr3

grammar TestCSharpParser;


options {
  language=CSharp3;
}

@parser::namespace { Demo.Antlr }
@lexer::namespace { Demo.Antlr }

parse returns [double value]
  :  exp EOF {$value = $exp.value;}
  ;

exp returns [double value]
  :  addExp {$value = $addExp.value;}
  ;

addExp returns [double value]
  :  a=mulExp       {$value = $a.value;}
     ( '+' b=mulExp {$value += $b.value;}
     | '-' b=mulExp {$value -= $b.value;}
     )*
  ;

mulExp returns [double value]
  :  a=unaryExp       {$value = $a.value;}
     ( '*' b=unaryExp {$value *= $b.value;}
     | '/' b=unaryExp {$value /= $b.value;}
     )*
  ;

unaryExp returns [double value]
  :  '-' atom {$value = -1.0 * $atom.value;}
  |  atom     {$value = $atom.value;}
  ;

atom returns [double value]
  :  Number      {$value = Double.Parse($Number.Text, CultureInfo.InvariantCulture);}
  |  '(' exp ')' {$value = $exp.value;}
  ;

Number
  :  ('0'..'9')+ ('.' ('0'..'9')+)?
  ;

Space 
  :  (' ' | '\t' | '\r' | '\n'){$channel = HIDDEN;}
  ;

语法不会使用ANTLRWorks解析简单的语句4/5(4/5)

有谁知道为什么会这样?这在我看来应该正常工作。

它不断给我NoViableAltException

1 个答案:

答案 0 :(得分:2)

我看到了与使用CSharp3目标有关的几个问题。

  • CSharp2和CSharp3目标定义常量Hidden而不是HIDDEN
  • ANTLRWorks不能用于为针对CSharp2或CSharp3目标的语法生成解析器。解析器必须由MSBuild(首选)或使用Antlr3.exe生成。这些内容记录在ANTLR 3 C# Releases维基页面上。
  • ANTLRWorks不能用于测试为CSharp2或CSharp3目标生成的解析器。解释器或调试器报告的任何结果都不可信任。