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_var
和id
的解决方案都适合我,可以将entity_id
保留为lexer规则,也可以将其移到解析器中。
我可以想到几种方法(不是按照特别的顺序):
>
entity_id
发出几个令牌。参见ANTLR4:如何为灵感注入令牌entity_id
标记并将它们拆分为其他几个标记,然后将此流传递给解析器entity_id
部分(=>is error)或(=>ignore error)内。创建一个“陷阱”规则,如下所示:
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