antlr4 - ANTLR4 空格问题,将数字与字母分开
问题描述
我有一个语法,应该区分 ID、INT 和 IP 地址。我的语法有更多要识别的模式,但我正在努力解决的是像“123abc”这样的标记。
通常,语法会定义 WS: [ \t\r\n]+ -> skip; 这将忽略空格,因此在我的语法输入中,如“123abc”将变为“123”和“abc”。这是词法分析器的正确行为。但是,我希望在这种情况下解析失败。
我在 SO 和其他一些网站上看到过类似的问题。我想出了一个可行的解决方案(如下),但在我看来应该有更好的方法。我想知道是否有人可以提出这样的方法。
这是我的(简化的)工作语法:
grammar Simple;
query: exp SP EOF;
exp: exp SP exp | term;
term: (name | sint) | name SP? '=' range_vals;
range_vals: SP? range_val SP? '..' SP? range_val;
sint: MINUS? INT;
range_val: (name | sint);
name: NAME;
MINUS: '-';
NAME: ALFA (ALFA_NUM)+;
fragment ALFA_NUM: ALFA | [0-9];
fragment ALFA: [a-z] | [A-Z];
INT: [0-9]+;
SP: ' '+;
WS: [\t\r\n]+ -> skip;
SL_COMMENT: '//' .*? '\n' -> skip;
解决方案
如果123abc
产生一个INT
令牌和一个NAME
令牌,那么就没有办法允许123 abc
,但123abc
同时也忽略空格。但是你可以做的是让它产生一个单一的令牌非法令牌,就像这样(把它放在 and 的定义之后NAME
,INT
所以这些将优先于有效的名称和数字):
ILLEGAL_NAME: ALFA_NUM+;
现在123 abc
会给你一个INT
和一个NAME
令牌,而123abc
会给你一个ILLEGAL_NAME
令牌,这将导致解析器出错,因为没有匹配它。
推荐阅读
- sql - 如何在 SQL 中的 WHERE 中和上链接多重?
- ms-access - MSAccess VBA 编码的变化
- firebase - 如何将 Firebase 实时数据库规则设置为只读子节点?
- python - 按索引写入多维数组
- git - 如何排除文件被合并到其他 git 分支?
- bash - 使用 shell 变量传递选项时 autotools 配置错误
- sql - 在 Azure SQL 数据库中按角色设置权限
- javascript - 在设计用于将输入数据与 json 进行比较然后输出的函数之外的函数中无法访问 JSON 数据
- aurelia - 如何使用带有 webpack 选项和 npm 的 aurelia cli 版本 1.0.0-beta.13 将 Font Awesome 添加到 Aurelia
- javascript - 我必须用 Zapier 替换 Code 上的一些特殊字符