当前位置: 首页 > 知识库问答 >
问题:

ANTLR4语法问题

邵毅
2023-03-14

我在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
;
line 1:4 missing {'INT', 'REAL'} at 'REAL'
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个答案

晏炳
2023-03-14

在第一个语法中,intreal规则位于id之后,因此字符串“int”和“real”与id规则匹配。在第二个语法中,您使用字符串,它(在混合语法中)创建了优先于显式规则的隐式lexer规则。

要修复第一个语法,请将intreal移动到id规则之上。

 类似资料:
  • 我对ANTLR相对来说是新的,所以请原谅我。 但是当我试图解析下面的表达式时 我最终出现以下错误: 第1:38行:'''处的令牌识别错误 第1:42行:'''处的令牌识别错误 规则r没有方法或者它有参数 规则'r'的意思是什么?我怎么能理解问题的原因呢?任何帮助都将不胜感激!

  • 我是ANTLR的新手,并使用ANTLR4(4.7.2 Jar文件)。我目前正在研究Oracle解析器。我对十进制数字有问题。我只保留了相关的部分。我的语法文件如下。 我该怎么做?我尝试过使用_input.la(-1)!='.'}?等,但对我来说并不正确。我尝试了提到的许多其他步骤(大多数解决方案适用于ANTLR3,但不适用于ANTLR4)。在lexer中有没有一种简单的方法可以做到这一点?我不想编

  • null 对此任何帮助都将不胜感激。

  • 但我看不出这两个规则中有任何空字符串的可能性。还是我错了?这个代码有什么问题?

  • 我的语法允许以下操作: 我从其他语法中抓了几个东西来玩。我的主要问题是我的expr规则。给定以下输入:,我期望解析树会找到..规则,但它将解释0。并不正确解析其余部分。 如果在我的0后面加上一个空格,就可以了: 谢了!