antlr - 注释行错误

时间:2014-06-26 11:18:36

标签: antlr antlrworks

我在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规则调试的几乎所有类型的语法都会崩溃到相同的错误中。

请提前帮助并表示感谢。

1 个答案:

答案 0 :(得分:1)

不是:

COMMENT
    : '--' ~('/r' | '/n')* {skip();}
    ; 

但:

COMMENT
    : '--' ~('\r' | '\n')* {skip();}
    ; 

问题是/n两个字符,而否定运算符仅适用于单个字符集。您不能否定两个子字符串'/r''/n'但您可以否定两个(单个)字符'\r''\n'的集合。