和那个没有除法的计算器比(也许是留给我们的作业 :p),这个例子比较象样:
先看词法:
class ExprLexer extends Lexer;
WS : (' '
| '/t'
| '/n'
| '/r')
{ _ttype = Token.SKIP; }
;
LPAREN: '('
;
RPAREN: ')'
;
PLUS_MINUS: '+' | '-' // 加减
;
MULT_DIV : '*' | '/' // 乘除
;
ASSIGN : '=' // 赋值
;
COMMA : ','
;
CHAR_LITERAL
: '/'' (ESC|~'/'') '/'' // 支持转义符的字符定义
;
STRING_LITERAL // 支持转义符的字符串
: '"' (ESC|~'"')* '"'
;
protected
ESC : '//' // 转义符
( 'n'
| 'r'
| 't'
| 'b'
| 'f'
| '"'
| '/''
| '//'
| ('0'..'3')
(
options {
warnWhenFollowAmbig = false;
}
: ('0'..'9')
(
options {
warnWhenFollowAmbig = false;
}
: '0'..'9'
)?
)?
| ('4'..'7')
(
options {
warnWhenFollowAmbig = false;
}
: ('0'..'9')
)?
)
;
protected
DIGIT
: '0'..'9' // 数码
;
INT
: (DIGIT)+ // 整数
;
ID
options { // 标识符
testLiterals = true;
}
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
;