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

理解ANTLR4中的lexer规则解析

徐焱
2023-03-14
grammar KeywordTest;
enumDef : 'enum' '{' ... '}';
...
FOR: 'for'
...
ID:[a-zA-Z]; // does not match 'enum' or 'for'
ENUM_KEYWORD: 'enum'

ATNLR4可能在内部使用的代码将在规则enumdef:“enum”“{”...“}之后被取消,如下所示:

enumDef: ENUM_KEYWORD '{' ... '}
ENUM_KEYWORD: 'enum'

ANTLR4就是这样做事的吗?

共有1个答案

卢文博
2023-03-14

lexer规则的顺序在语法中非常重要,因为将使用找到的第一个适用规则。你可以在这里读到更多。

因此,如果您有lexer规则:

ID: [a-zA-Z]+;
FOR: 'for';

根据其顺序输入,“FOR”将被标记为FOR token或ID token,因为对于这两者,它都是正确的。

alfaNum: (ALFA | NUM | ambigous | '_' )+?;
ambigous: SELECT | WHERE | FROM | WITH | SET | AS;
 类似资料:
  • 我刚刚开始学习ANTLR4 lexer规则。我的目标是为Java属性文件创建一个简单的语法。以下是我目前掌握的信息:

  • null null 以下是我的(不完整和不成功的)尝试: 如果不能在lexer中解决这个问题,我可以使用标记、、、、、和自行编写解析器规则。

  • 我对是否允许以下情况感到困惑: UPDATE:我知道当我在for循环中提供正确的声明类型时,它就会工作。问题是如果我不这样做会发生什么?

  • 我正在使用antlr4 c语法作为我自己语法的灵感。我来了一件事,我真的不明白。为什么没有使用数据类型时会有Lexer规则?例如,规则从未使用过,但分析器规则(为了简化已删除其他数据类型)使用了好几个地方。解析器规则typeSpecifier没有使用lexer规则double有什么原因吗?

  • 在ANTLR4中,我有一个lexer规则,说我可以使用任何字符得到任何单词,但空格和换行符除外。其定义如下: 我还有一个lexer规则(定义在than WORD之前),用于进入EVAL模式: 我考虑的另一个选择是将“word”定义为${and}包围的文本以外的任何东西。但我不知道如何创建这样的lexer规则。 我该怎么解决?要区分评价和词?