C# ANTLR语法和生成的代码问题
我正在尝试使用ANTLR创建一个表达式解析器 表达式将进入if语句中,因此其根是一个条件 我有下面的语法,它“编译”到解析器/词法器文件没有问题,但是生成的代码本身有一些错误,基本上是两个“空”if语句 即 如果(()) 不知道我做错了什么,任何帮助都将不胜感激 谢谢 Grammar.g文件如下: 语法表达C# ANTLR语法和生成的代码问题,c#,parsing,expression,antlr,antlr3,C#,Parsing,Expression,Antlr,Antlr3,我正在尝试使用ANTLR创建一个表达式解析器 表达式将进入if语句中,因此其根是一个条件 我有下面的语法,它“编译”到解析器/词法器文件没有问题,但是生成的代码本身有一些错误,基本上是两个“空”if语句 即 如果(()) 不知道我做错了什么,任何帮助都将不胜感激 谢谢 Grammar.g文件如下: 语法表达 options { language=CSharp3; output=AST; } tokens { ROOT; UNARY_MIN; } @parser::namesp
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();}
;
选项{
语言=CS3;
输出=AST;
}
代币{
根;
一元人民币;
}
@解析器::命名空间{Antlr3}
@lexer::命名空间{Antlr3}
公共解析
:orcond EOF->^(根orcond)
;
奥康德
:andcond(“| |”andcond)*
;
安第斯
:条件(“&&”条件)*
;
条件
:exp((“|”=”|“!=”|“=”)^exp)?
;
经验
:addExp
;
加法器
:mulExp((“+”|“-”)^mulExp)*
;
mulExp
:unaryExp((“*”|“/”)^unaryExp)*
;
一元表达式
:“-”原子->^(一元最小原子)
|原子
;
原子
:号码
|“(“圆括号有效”)”->圆括号有效
;
括号有效
:fullobjectref
|奥康德
;
fullobjectref
:objectref('.'objectref')?
;
objectref
:objectname(“()”|“(“params”)“|”[“params”]”)?
;
对象名
:('a'..'z')|('a'..'z'))^('a'..'z')|('a'..'z')|('0'..'9')|')*
;
params
:paramitem(“,”paramitem)?
;
参数项
:unaryExp
;
数
: ('0'..'9')+ ('.' ('0'..'9')+)?
;
空间
:(“”|’\t’|’\r’|’\n’{Skip();}
;
不要在解析器规则中使用范围运算符。
删除解析器规则objectname
并创建lexer规则:
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');
你有没有试着逐步实现你的语法?您是否尝试使用AntlWord调试器?此线程可能会有所帮助。我没有读过,但问题似乎是一样的: