我的 antlr 文件是
class CalculatorParser extends Parser;expr returns [float value=0]
{float x;}
: value=mexpr
( PLUS x=mexpr {value += x;}
| MINUS x=mexpr {value -= x;}
)*
;mexpr returns [float value=0]
{float x;}
: value=atom ( STAR x=atom {value *= x;} | DIV x=atom {value=value * 100 / x * 0.01f;} )*
;
atom returns [float value=0]
: i:INT {value=Integer.parseInt(i.getText());}
| LPAREN value=expr RPAREN
;
class CalculatorLexer extends Lexer;
options {
k=2; // needed for newline junk
charVocabulary='\u0000'..'\u007F'; // allow ascii
}LPAREN: '(' ;
RPAREN: ')' ;
PLUS : '+' ;
MINUS : '-' ;
STAR : '*' ;
DIV : '/' ;
INT : ('0'..'9')+ ;
WS : ( ' '
| '\r' '\n'
| '\n'
| '\t'
)
{$setType(Token.SKIP);}
;
==============================
问题是如果输入负数 就会报错~~
在网上看到个C#的antlr文件
=================
/******************************\
Calc Parser
\******************************/
class CalcParser extends Parser;
options
{
exportVocab = Calc;
buildAST = true;
}
expr
: sumExpr EOF
;
sumExpr
: mulExpr ( ( SUM^ | NEG^ ) mulExpr )*
;
mulExpr
: powExpr ( ( MUL^ | DIV^ ) powExpr )*
;
powExpr
: negExpr ( POW^ negExpr )*
;
negExpr
: ( NEG^ )* a:atom!
{
if (#negExpr != null) {
AST lastNegNode = #negExpr;
while (lastNegNode.getNumberOfChildren() > 0) {
lastNegNode = lastNegNode.getFirstChild();
}
lastNegNode.setFirstChild(#a);
} else {
## = #a;
}
}
;
atom
: NUMBER
| LCURLY sumExpr RCURLY
;
/***************************\
Calc Lexer
\***************************/
class CalcLexer extends Lexer;
options
{
caseSensitive = false;
exportVocab = Calc;
}
WS
: ( ' '
| '\t'
| '\n'
| '\r' )+ { $setType(Token.SKIP); }
;
NUMBER
: ( ( '0'..'9' )+ '.' ( '0'..'9' )+ ) => ( '0'..'9' )+ '.' ( '0'..'9' )+
| '0'..'9'
;
SUM : '+' ;
NEG : '-' ;
MUL : '*' ;
DIV : '/' ;
POW : '^' ;
LCURLY : '(' ;
RCURLY : ')' ;请问这个文件能能编译出判断负数的四则运算吗?
#号描述是什么作用?
不理解:
negExpr
: ( NEG^ )* a:atom!
{
if (#negExpr != null) {
AST lastNegNode = #negExpr;
while (lastNegNode.getNumberOfChildren() > 0) {
lastNegNode = lastNegNode.getFirstChild();
}
lastNegNode.setFirstChild(#a);
} else {
## = #a;
}
}
;
能帮我分析一下吗?
class CalculatorParser extends Parser;expr returns [float value=0]
{float x;}
: value=mexpr
( PLUS x=mexpr {value += x;}
| MINUS x=mexpr {value -= x;}
)*
;mexpr returns [float value=0]
{float x;}
: value=atom ( STAR x=atom {value *= x;} | DIV x=atom {value=value * 100 / x * 0.01f;} )*
;
atom returns [float value=0]
: i:INT {value=Integer.parseInt(i.getText());}
| LPAREN value=expr RPAREN
;
class CalculatorLexer extends Lexer;
options {
k=2; // needed for newline junk
charVocabulary='\u0000'..'\u007F'; // allow ascii
}LPAREN: '(' ;
RPAREN: ')' ;
PLUS : '+' ;
MINUS : '-' ;
STAR : '*' ;
DIV : '/' ;
INT : ('0'..'9')+ ;
WS : ( ' '
| '\r' '\n'
| '\n'
| '\t'
)
{$setType(Token.SKIP);}
;
==============================
问题是如果输入负数 就会报错~~
在网上看到个C#的antlr文件
=================
/******************************\
Calc Parser
\******************************/
class CalcParser extends Parser;
options
{
exportVocab = Calc;
buildAST = true;
}
expr
: sumExpr EOF
;
sumExpr
: mulExpr ( ( SUM^ | NEG^ ) mulExpr )*
;
mulExpr
: powExpr ( ( MUL^ | DIV^ ) powExpr )*
;
powExpr
: negExpr ( POW^ negExpr )*
;
negExpr
: ( NEG^ )* a:atom!
{
if (#negExpr != null) {
AST lastNegNode = #negExpr;
while (lastNegNode.getNumberOfChildren() > 0) {
lastNegNode = lastNegNode.getFirstChild();
}
lastNegNode.setFirstChild(#a);
} else {
## = #a;
}
}
;
atom
: NUMBER
| LCURLY sumExpr RCURLY
;
/***************************\
Calc Lexer
\***************************/
class CalcLexer extends Lexer;
options
{
caseSensitive = false;
exportVocab = Calc;
}
WS
: ( ' '
| '\t'
| '\n'
| '\r' )+ { $setType(Token.SKIP); }
;
NUMBER
: ( ( '0'..'9' )+ '.' ( '0'..'9' )+ ) => ( '0'..'9' )+ '.' ( '0'..'9' )+
| '0'..'9'
;
SUM : '+' ;
NEG : '-' ;
MUL : '*' ;
DIV : '/' ;
POW : '^' ;
LCURLY : '(' ;
RCURLY : ')' ;请问这个文件能能编译出判断负数的四则运算吗?
#号描述是什么作用?
不理解:
negExpr
: ( NEG^ )* a:atom!
{
if (#negExpr != null) {
AST lastNegNode = #negExpr;
while (lastNegNode.getNumberOfChildren() > 0) {
lastNegNode = lastNegNode.getFirstChild();
}
lastNegNode.setFirstChild(#a);
} else {
## = #a;
}
}
;
能帮我分析一下吗?
解决方案 »
- jdk 环境变量 设置
- 输出26个英文字母有格式要求的,想不出来了。在线等!
- javascript vbscript 小问题
- hashcode
- scjp 异常的几个问题
- java语言如何实现WMI访问远程主机?
- JDBC连接Mysql数据库出现NoClassDefFoundError错误
- 请教制作Javamail的方法(50分送上)
- 关于JTextPane自动滚屏的问题。(up有分了)
- 如何控制Corba客户端的连接?(比如在服务器上可以关掉客户端的连接)(发言就给分)
- 不是说抽象类不能实例化吗?为什么这里可以。
- 请问有没有可能设置JPanel上的JButton去"触发"菜单上的某个MeunItem的事件?
实在有好多的不明白的地方
请大人们帮忙
我的mail:[email protected]
在这里谢谢了
负号和你的这个Token(MINUS)冲突了,你到JavaCC上把JavaCC Tutorial档下来看看就清楚了。