繁体   English   中英

ANTLR语法和生成的代码问题

[英]ANTLR Grammar and generated code problems

我正在尝试使用ANTLR创建表达式解析器表达式将进入if语句,因此其根是一个条件。

我有以下语法,它“编译”到解析器/词法分析器文件没有问题,但是生成的代码本身有一些错误,基本上是两个“空”if语句,即if(())

不知道我做错了什么,任何帮助将不胜感激。

谢谢。

语法.g文件如下:语法表达;

options {
  language=CSharp3;
  output=AST;
}

tokens {
  ROOT;
  UNARY_MIN;
}

@parser::namespace { Antlr3 }
@lexer::namespace { Antlr3 }
public parse
  :  orcond EOF -> ^(ROOT orcond)
  ;

orcond
  :  andcond ('||' andcond)*
  ;

andcond
  :  condition ('&&' condition)*
  ;

condition
  :  exp (('<' | '>' | '==' | '!=' | '<=' | '>=')^ exp)?
  ;

exp
  :  addExp
  ;

addExp
  :  mulExp (('+' | '-')^ mulExp)*
  ;

mulExp
  :  unaryExp (('*' | '/')^ unaryExp)*
  ;

unaryExp
  :  '-' atom -> ^(UNARY_MIN atom)
  |  atom
  ;

atom
  :  Number
  |  '(' parenthesisvalid ')' -> parenthesisvalid
  ;

parenthesisvalid
  :  fullobjectref
  |  orcond
  ;

fullobjectref
  :  objectref ('.' objectref)?
  ;

objectref
  :  objectname ('()' | '(' params ')' | '[' params ']')?
  ;

objectname
  :  (('a'..'z') | ('A'..'Z'))^ (('a'..'z') | ('A'..'Z') | ('0'..'9') | '_')*
  ;

params
  :  paramitem (',' paramitem)?
  ;

paramitem
  :  unaryExp
  ;

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

Space 
  :  (' ' | '\t' | '\r' | '\n'){Skip();}
  ;

不要在解析器规则中使用范围运算符, ..

删除解析器规则objectname并创建词法分析器规则:

Objectname
  :  ('a'..'z' | 'A'..'Z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*
  ;

此外,使用片段块将更加巧妙。 在这种情况下,您的代码将是这样的:

Objectname  :  LETTER (LETTER  | DIGIT | '_')*;    
Number: DIGIT+ ('.' DIGIT+)?;
fragment DIGIT : '0'..'9' ;
fragment LETTER : ('a'..'z' | 'A'..'Z'); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM