我在AntlrWorks 1.4.3下使用Antlr 3并且我在编写语法时无法忽略注释行。
这是表现出问题的语法:
grammar Ex2;
@header {
import java.util.HashMap;
}
@members {
HashMap memory = new HashMap();
}
prog: stat+ ;
stat
: expr NEWLINE {System.out.println($expr.value);}
| ID '=' expr NEWLINE
{ memory.put($ID.text, new Integer($expr.value)); }
| NEWLINE
;
expr returns [int value]
: e=term {$value = $e.value;}
( '+' e=term {$value += $e.value;}
| '-' e=term {$value -= $e.value;}
)*
;
term returns [int value]
: e=fact {$value = $e.value; }
( '*' e=fact {$value *= $e.value;}
| '/' e=fact {$value /= $e.value;}
| '^' e=fact {
for(int i = 0; i < $e.value; i++)
$value *= $value;
}
)*;
fact returns [int value]
: INT {$value = Integer.parseInt($INT.text);}
| ID
{
Integer v = (Integer)memory.get($ID.text);
if ( v!=null ) $value = v.intValue();
else System.err.println("undefined variable "+$ID.text);
}
| '(' expr ')' {$value = $expr.value;}
;
COMMENT
: '--' ~('/r' | '/n')* {skip();}
;
ID
: ('a'..'z'|'A'..'Z')+
;
INT
: '0'..'9'+
;
NEWLINE
:'\r'? '\n'
;
WS
: (' '|'\t')+ {skip();}
;
我收到此错误
error(204): /../Ex2.g:46:16: duplicate token type '/n' when collapsing subrule into set
我想提一下,我尝试使用词法分析器的COMMENT规则调试的几乎所有类型的语法都会崩溃到相同的错误中。
请提前帮助并表示感谢。
答案 0 :(得分:1)
不是:
COMMENT
: '--' ~('/r' | '/n')* {skip();}
;
但:
COMMENT
: '--' ~('\r' | '\n')* {skip();}
;
问题是/n
是两个字符,而否定运算符仅适用于单个字符集。您不能否定两个子字符串'/r'
和'/n'
但您可以否定两个(单个)字符'\r'
和'\n'
的集合。