gpt4 book ai didi

antlr - 在从词法分析器中跳过 WS 时编写对空格敏感的解析器规则

转载 作者:行者123 更新时间:2023-12-04 21:15:18 27 4
gpt4 key购买 nike

我在处理空格时遇到了一些麻烦。在以下语法摘录中,我设置了词法分析器,以便解析器跳过空格:

ENTITY_VAR
: 'user'
| 'resource'
;

INT : DIGIT+ | '-' DIGIT+ ;
ID : LETTER (LETTER | DIGIT | SPECIAL)* ;
ENTITY_ID : '__' ENTITY_VAR ('_w_' ID)?;

NEWLINE : '\r'? '\n';

WS : [ \t\r\n]+ -> skip; // skip spaces, tabs, newlines

fragment LETTER : [a-zA-Z];
fragment DIGIT : [0-9];
fragment SPECIAL : ('_' | '#' );

问题是,我想匹配 ENTITY_ID 形式的变量名称这样匹配的字符串就没有任何空格。像我在这里所做的那样将它写为词法分析器规则就足够了,但问题是我想用解析器规则来代替它,因为我想直接访问这两个标记 ENTITY_VARID单独从我的代码中分离出来,而不是将它们挤回到一个完整的 token 中 ENTITY_ID .

有什么想法吗?
基本上任何让我直接访问的解决方案 ENTITY_VARID都适合我,离开 ENTITY_ID作为词法规则或将其移动到解析器。

最佳答案

我可以想到几种方法(没有特殊顺序):

  • 从规则 ENTITY_ID 发出多个 token .见 ANTLR4: How to inject tokens寻找灵感
  • 在解析器中允许空格,然后检查
  • 使用单个 token 并在代码中拆分
  • 使用单个 token 并在将其传递给解析器之前修改 token 流。 IE。 lex,修改ENTITY_ID token 并将它们拆分为其他几个 token ,然后将此流传递给解析器
  • 不要跳过空格,在处理这些“额外标记”时检查它们是否在 ENTITY_ID 内部分(=> 是错误)或不是(=> 忽略错误)。
  • 不要跳过空格并在允许空格的语法中的任何地方添加“WS*”(如果语法不是太大,则可以)。
  • 在解析器规则中插入谓词,检查它们之间是否有空格。
  • 像这样创建一个“陷阱”规则:
    INVALID_ENTITY_ID : '__' WS+ ENTITY_VAR WS? ('_w_' WS? ID)?
    | '__' WS? ENTITY_VAR WS+ ('_w_' WS? ID)?
    | '__' WS? ENTITY_VAR WS? ('_w_' WS+ ID)
    ;

    这将捕获无效 ENTITY_ID s 因为它比那些也是单独标记的部分长。

  • 我会选择 2,如果它在“非错误”情况下不改变解析,即没有代码通过允许空格被不同地解释。

    关于antlr - 在从词法分析器中跳过 WS 时编写对空格敏感的解析器规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25039472/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com