ANTLR4语法问题

时间:2016-06-01 11:29:46

标签: antlr antlr4

我在ANTLR4中有以下语法

grammar DEF;

def
:
    'DEF' vartypes ID ';'
;

ID
:
    (
        'A' .. 'Z'|'a'..'z'
    )+
;

vartypes
:
    INT
    | REAL
;

INT:'INT';
REAL:'REAL';

VARIABLE
:
    (
        'A' .. 'Z'
        | 'a' .. 'z'
        | '0' .. '9'
        | '_'
        | '-'
    )+
;

fragment VARTYPEREAL
:
    'REAL'
;

fragment VARTYPEINT
:
    'INT'
;

LINENUMBER
:
    'N' INTVALUE
;

INTVALUE
:
    (
        '-'
    )?
    (
        '0' .. '9'
    )+
;

WS
:
    (
        ' '
        | '\t'
        | '\n'
        | '\r'
    )+ -> skip
;

当我解析字符串'DEF REAL test;'时我收到以下错误:

line 1:4 missing {'INT', 'REAL'} at 'REAL'

第1行:9个无关输入'test'期待';'

但是,当我将语法改为

grammar DEF;

def
:
    'DEF' vartypes ID ';'
;

ID
:
    (
        'A' .. 'Z'|'a'..'z'
    )+
;

vartypes
:
    'INT'
    | 'REAL'
;

VARIABLE
:
    (
        'A' .. 'Z'
        | 'a' .. 'z'
        | '0' .. '9'
        | '_'
        | '-'
    )+
;

fragment VARTYPEREAL
:
    'REAL'
;

fragment VARTYPEINT
:
    'INT'
;

LINENUMBER
:
    'N' INTVALUE
;

INTVALUE
:
    (
        '-'
    )?
    (
        '0' .. '9'
    )+
;

WS
:
    (
        ' '
        | '\t'
        | '\n'
        | '\r'
    )+ -> skip
;
一切都很好。我在语法1中哪里错了?

1 个答案:

答案 0 :(得分:0)

INT之后的第一个语法REALID规则中,字符串“INT”和“REAL”与ID规则匹配。在你的第二个语法中,你使用字符串,它(在你喜欢的混合语法中)创建隐式词法分析器规则,优先于显式规则。

修复第一个语法移动INTREAL以上ID规则。