1
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;}
  ;

语法不会解析简单语句4/5(4/5)使用 ANTLRWorks 尝试过。

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

它一直给我NoViableAltException

4

1 回答 1

2

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

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