为什么antrl4无法将标记识别为语法规则的一部分?

亚历克斯·穆塞尔(Alex Mussell)

我正在使用antlr4解析.eds文件。我写了一个语法,但遇到了一个问题,解析器将一个部分的主体中的每个标记解析为主体的一部分。似乎antlr4只是在忽略我的身体语法规则。

这是我的语法:

grammar test;

eds                 :   section+;

section             :   header body;

header              :   '[' header_name ']';

body                :   field+;

field               :   name '=' value STMTEND;

header_name         :   ~(']')+;

name                :   Identifier;

raw_value           :   string
                    |   integer
                    |   hex
                    |   version
                    |   date
                    |   time;

value               :   raw_value
                    |   list;

list                :   raw_value list_value+;

list_value          :   ',' raw_value
                    |   ',';

string              :   String_standard
                    |   string_list;

string_list         :   String_standard string_list
                    |   String_standard String_standard;

integer             :   Integer;
version             :   Version;
date                :   Date;
time                :   Time;
hex                 :   Hex;

String_standard     :   '"' ( Escape | ~('\'' | '\\' | '\n' | '\r') | '.' | '+' + '/' | ' ') + '"';
 
Escape              :   '\\' ( '\'' | '\\' );

Integer             :   NUMBER+;

Hex                 :   '0' 'x' HEX_DIGIT+;

Version             :   NUMBER+ '.' NUMBER+
                    |   NUMBER+ '.' NUMBER+ '.' NUMBER+
                    |   NUMBER+ '.' NUMBER+ '.' NUMBER+ '.' NUMBER+;

Date                :   NUMBER NUMBER '-' NUMBER NUMBER '-' NUMBER NUMBER NUMBER NUMBER;

Time                :   NUMBER NUMBER ':' NUMBER NUMBER ':' NUMBER NUMBER;

Identifier          :   Identifier_Char+;

HeaderID            :   Header_Char+;

fragment 
Identifier_Char     :   LETTER
                    |   NUMBER
                    |   '_';

fragment
Header_Char         :   LETTER
                    |   NUMBER 
                    |   '_' 
                    |   ' ';


fragment LETTER              :   [a-zA-Z];

fragment HEX_DIGIT           :   [a-fA-F0-9];

fragment NUMBER              :   [0-9];

STMTEND             :   SEMICOLON;

fragment SEMICOLON : ';';
fragment NEWLINE   : '\r' '\n' | '\n' | '\r';

WS:                 [ \t\r\n\u000C]+ -> channel(HIDDEN);
LINE_COMMENT:       '$' ~[\r\n]*    -> channel(HIDDEN);

这是我的输入:

[File]
        DescText = "EtherNet/IP EDS for ANT lite+ PLC";
        CreateDate = 02-16-2018;
        CreateTime = 14:13:46;
        ModDate = 10-11-2019;
        ModTime = 11:05:09;
        Revision = 1.2;
        HomeURL = "www.bluebotics.com";
        1_IOC_Details_License = 0x7B457ED4;

当我使用antlr4 gui可视化解析树时,我看到标头已正确解析,但是主体为每个令牌只有一个孩子:

这是树的输出,您可以看到它根本没有解析正文:

(eds (section (header [ (header_name File) ]) (body DescText  =   "EtherNet/IP EDS for ANT lite+ PLC" ; CreateDate  =  02 16 2018 ; CreateTime  =  14 13 46 ; ModDate  =  10 11 2019 ; ModTime  =  11 05 09 ; Revision  =  1 2 ; HomeURL  =   "www.bluebotics.com" ; 1_IOC_Details_License  =  0x7B457ED4 ;)))

如何更改语法,使antlr实际解析身体?

巴特·基尔斯

放置ANY : .;在你的语法的结束,使得词法分析器不会产生任何错误/警告。这样,更容易发现问题出在哪里。ANY添加规则后,您将看到输入被标记为以下形式:

null                      `[`
Identifier                `File`
null                      `]`
WS                        `\n        `
HeaderID                  `DescText `
null                      `=`
HeaderID                  ` `
String_standard           `"EtherNet/IP EDS for ANT lite+ PLC"`
STMTEND                   `;`
WS                        `\n        `
HeaderID                  `CreateDate `
null                      `=`
HeaderID                  ` 02`
ANY                       `-`
Integer                   `16`
ANY                       `-`
Integer                   `2018`
STMTEND                   `;`
WS                        `\n        `
HeaderID                  `CreateTime `
null                      `=`
HeaderID                  ` 14`
ANY                       `:`
Integer                   `13`
ANY                       `:`
Integer                   `46`
STMTEND                   `;`
WS                        `\n        `
HeaderID                  `ModDate `
null                      `=`
HeaderID                  ` 10`
ANY                       `-`
Integer                   `11`
ANY                       `-`
Integer                   `2019`
STMTEND                   `;`
WS                        `\n        `
HeaderID                  `ModTime `
null                      `=`
HeaderID                  ` 11`
ANY                       `:`
Integer                   `05`
ANY                       `:`
Integer                   `09`
STMTEND                   `;`
WS                        `\n        `
HeaderID                  `Revision `
null                      `=`
HeaderID                  ` 1`
ANY                       `.`
Integer                   `2`
STMTEND                   `;`
WS                        `\n        `
HeaderID                  `HomeURL `
null                      `=`
HeaderID                  ` `
String_standard           `"www.bluebotics.com"`
STMTEND                   `;`
WS                        `\n        `
HeaderID                  `1_IOC_Details_License `
null                      `=`
HeaderID                  ` 0x7B457ED4`
STMTEND                   `;`
EOF                       `<EOF>`

如您所见,您HeaderID搞砸了:它实际上不应包含空格。删除此HeaderID规则(以及ANY规则),解析器将正确解析它:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Bash脚本无法将变量识别为路径的一部分

来自分类Dev

如何让python将DBF中的字符串值识别为if / else语句的一部分?

来自分类Dev

为什么将这个geom_density的一部分遗漏在图中?

来自分类Dev

为什么将ffmpeg作为x11的一部分删除?

来自分类Dev

语音标记和实体识别的一部分-python

来自分类Dev

如何防止百灵鸟将标识符的一部分识别为关键字?

来自分类Dev

Excel:将单元格格式中显示的文本集识别为单元格文本的一部分

来自分类Dev

为什么将位置固定的部分与另一部分一起移动?

来自分类Dev

Intellij 16-单元测试未识别为Android模块项目的一部分

来自分类Dev

Excel 表格 - 新行不会自动识别为先前定义的表格的一部分

来自分类Dev

提取图像的一部分以识别

来自分类Dev

使用lxml标记文本的一部分

来自分类Dev

JavaScript语法一部分的左分解

来自分类Dev

为什么我无法在python中匹配我的正则表达式的最后一部分?

来自分类Dev

为什么在第一部分打印4个而不是3个数字?

来自分类Dev

为什么这部分代码要先于另一部分执行?

来自分类Dev

为什么ctx.drawImage仅将视频元素的一部分绘制到画布上?

来自分类Dev

重写规则:将URL中的一部分文本更改为另一部分

来自分类Dev

Spamassassin规则,将To:标头的一部分与主题行的一部分进行比较

来自分类Dev

ANTLR匹配解析器规则的一部分,即使它无法完全匹配该规则

来自分类Dev

C如何将宏标记识别为参数

来自分类Dev

为什么我要在特性上实现方法而不是特性的一部分?

来自分类Dev

为什么React会更新DOM的这一部分?

来自分类Dev

为什么runXXX不是MonadTrans定义的一部分?

来自分类Dev

为什么HTTP GET参数应该是url的一部分

来自分类Dev

为什么我不能在Java中复制数组的一部分?

来自分类Dev

为什么drawRect留下图像的一部分?

来自分类Dev

为什么只记录我的json数据的一部分?

来自分类Dev

为什么排序方法是Collection而不是AbstractList的一部分?

Related 相关文章

  1. 1

    Bash脚本无法将变量识别为路径的一部分

  2. 2

    如何让python将DBF中的字符串值识别为if / else语句的一部分?

  3. 3

    为什么将这个geom_density的一部分遗漏在图中?

  4. 4

    为什么将ffmpeg作为x11的一部分删除?

  5. 5

    语音标记和实体识别的一部分-python

  6. 6

    如何防止百灵鸟将标识符的一部分识别为关键字?

  7. 7

    Excel:将单元格格式中显示的文本集识别为单元格文本的一部分

  8. 8

    为什么将位置固定的部分与另一部分一起移动?

  9. 9

    Intellij 16-单元测试未识别为Android模块项目的一部分

  10. 10

    Excel 表格 - 新行不会自动识别为先前定义的表格的一部分

  11. 11

    提取图像的一部分以识别

  12. 12

    使用lxml标记文本的一部分

  13. 13

    JavaScript语法一部分的左分解

  14. 14

    为什么我无法在python中匹配我的正则表达式的最后一部分?

  15. 15

    为什么在第一部分打印4个而不是3个数字?

  16. 16

    为什么这部分代码要先于另一部分执行?

  17. 17

    为什么ctx.drawImage仅将视频元素的一部分绘制到画布上?

  18. 18

    重写规则:将URL中的一部分文本更改为另一部分

  19. 19

    Spamassassin规则,将To:标头的一部分与主题行的一部分进行比较

  20. 20

    ANTLR匹配解析器规则的一部分,即使它无法完全匹配该规则

  21. 21

    C如何将宏标记识别为参数

  22. 22

    为什么我要在特性上实现方法而不是特性的一部分?

  23. 23

    为什么React会更新DOM的这一部分?

  24. 24

    为什么runXXX不是MonadTrans定义的一部分?

  25. 25

    为什么HTTP GET参数应该是url的一部分

  26. 26

    为什么我不能在Java中复制数组的一部分?

  27. 27

    为什么drawRect留下图像的一部分?

  28. 28

    为什么只记录我的json数据的一部分?

  29. 29

    为什么排序方法是Collection而不是AbstractList的一部分?

热门标签

归档