是否有可能在 ANTLR4 中使用令牌
Is it possible to have tokens that use tokens in ANTLR4
我是 Antlr 的新手,我正在努力学习。我有一个带有定义标记的词法分析器。还有另一个使用我的令牌子集的令牌。
ADDQ: 'addq';
SUBQ: 'subq';
ANDQ: 'andq';
XORQ: 'xorq';
OP: (ADDQ | ANDQ | XORQ | SUBQ);
在我的解析器中,我有一个名为 doOperation 的规则:
doOperation:
OP REGISTER COMMA REGISTER;
当我使用 Intellij 的 ANTLR 插件测试规则时。举个例子:subq %rax, %rcx。我收到一条错误消息 "mismatched input at subq, expect OP"。这样做的正确方法是什么?
您可以在其他令牌规则中使用令牌规则,但是当您这样做时,周围应该有其他匹配的文本。类似于:
A: 'abc';
B: A 'def';
根据这些规则,字符串 "abc" 将生成一个 A
标记,而 "abcdef" 将生成一个 B
标记。
但是,当您像您一样将一个规则定义为替代其他规则时,您最终会得到多个可以匹配相同输入的词法规则。当词法规则重叠时,ANTLR(就像绝大多数词法分析器生成器一样)将首先选择导致最长匹配的规则,如果出现平局,则选择语法中最先出现的规则。
因此根据您的规则,输入 addq
会产生一个 ADDQ
标记,因为 ADDQ
在语法中出现在 OP
之前。 SUBQ
和其他人也一样。所以不可能生成 OP
令牌。
既然你说你在解析器规则中不使用 ADDQ
、SUBQ
等,你可以将它们制成片段而不是令牌规则。片段可用于令牌规则,但本身不是令牌。所以你永远不会得到 SUBQ
令牌,因为 SUBQ
不是令牌 - 你只能得到 OP
令牌。事实上,你甚至根本不需要给他们起名字,你可以像这样 "inline" 他们进入 OP:
OP: 'addq' | 'subq' | 'andq' | 'xorq' ;
另一个选项(如果您直接使用 SUBQ
等则必须使用的选项)是将 OP
变成解析器规则而不是标记。这样输入 subq
仍会生成 SUBQ
标记,但这没关系,因为现在 op
规则将接受 SUBQ
标记。
我是 Antlr 的新手,我正在努力学习。我有一个带有定义标记的词法分析器。还有另一个使用我的令牌子集的令牌。
ADDQ: 'addq';
SUBQ: 'subq';
ANDQ: 'andq';
XORQ: 'xorq';
OP: (ADDQ | ANDQ | XORQ | SUBQ);
在我的解析器中,我有一个名为 doOperation 的规则:
doOperation:
OP REGISTER COMMA REGISTER;
当我使用 Intellij 的 ANTLR 插件测试规则时。举个例子:subq %rax, %rcx。我收到一条错误消息 "mismatched input at subq, expect OP"。这样做的正确方法是什么?
您可以在其他令牌规则中使用令牌规则,但是当您这样做时,周围应该有其他匹配的文本。类似于:
A: 'abc';
B: A 'def';
根据这些规则,字符串 "abc" 将生成一个 A
标记,而 "abcdef" 将生成一个 B
标记。
但是,当您像您一样将一个规则定义为替代其他规则时,您最终会得到多个可以匹配相同输入的词法规则。当词法规则重叠时,ANTLR(就像绝大多数词法分析器生成器一样)将首先选择导致最长匹配的规则,如果出现平局,则选择语法中最先出现的规则。
因此根据您的规则,输入 addq
会产生一个 ADDQ
标记,因为 ADDQ
在语法中出现在 OP
之前。 SUBQ
和其他人也一样。所以不可能生成 OP
令牌。
既然你说你在解析器规则中不使用 ADDQ
、SUBQ
等,你可以将它们制成片段而不是令牌规则。片段可用于令牌规则,但本身不是令牌。所以你永远不会得到 SUBQ
令牌,因为 SUBQ
不是令牌 - 你只能得到 OP
令牌。事实上,你甚至根本不需要给他们起名字,你可以像这样 "inline" 他们进入 OP:
OP: 'addq' | 'subq' | 'andq' | 'xorq' ;
另一个选项(如果您直接使用 SUBQ
等则必须使用的选项)是将 OP
变成解析器规则而不是标记。这样输入 subq
仍会生成 SUBQ
标记,但这没关系,因为现在 op
规则将接受 SUBQ
标记。