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

在从lexer跳过WS时编写对空白敏感的解析器规则

江新
2023-03-14
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_varid的解决方案都适合我,可以将entity_id保留为lexer规则,也可以将其移到解析器中。

共有1个答案

顾赞
2023-03-14

我可以想到几种方法(不是按照特别的顺序):

>

  • 从规则entity_id发出几个令牌。参见ANTLR4:如何为灵感注入令牌
  • 在解析器中允许空格,然后检查
  • 使用单个标记并在代码中拆分
  • 使用单个令牌并修改令牌流,然后将其传递给解析器。即。修改entity_id标记并将它们拆分为其他几个标记,然后将此流传递给解析
  • 不要跳过空白,在处理这些“额外标记”时,请检查它们是否在entity_id部分(=>is error)或(=>ignore error)内。
  • 不要跳过空格,在语法中允许空格的地方添加“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,因为它比作为单个令牌的部分要长。

  •  类似资料:
    • 对此有什么最佳方法的想法吗?我尝试添加代码来替换回车或跳过空行,但似乎没有帮助。

    • 我有Antlr4中的语法,用来解析和验证定制语言。在其他方面,我的语法应该认为以下是“有效的” //将字符串值赋给变量 //带有字符串参数的函数 //带有特定格式(日期)的函数 下面是我语法中的相关部分

    • 可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?

    • 我们在ANTLR中遇到的问题是,我们有这样一个语法: 请记住“鲍勃。”第一行是动态的,可以是任何东西。其中之一就是“鲍勃”。“Bob Offset”行不是动态的,它存在于我们正在解析的每一个类型的文件中。 理想的解决方案是,如果ANTLR有某种方法来指定上下文或解析器规则特定的lexer规则。这样,“Bob offset:”标记在语法中的其他地方就不会出错了。 对此问题的任何想法都将不胜感激。

    • 磁敏传感器可以检测模块周围是否有磁体。 生活实例 扫地机器人的虚拟墙使用了磁场检测来判断能否通行。 参数 尺寸:24×20mm 检测距离:<1cm 工作电流:15mA

    • 磁敏传感器可以检测模块周围是否有磁体。 生活实例 扫地机器人的虚拟墙使用了磁场检测来判断能否通行。 参数 尺寸:24×20mm 检测距离:<1cm 工作电流:15mA