Antlr4 如何在特定规则中不允许空白-否则语法将正确跳过空白

Antlr4 如何在特定规则中不允许空白-否则语法将正确跳过空白,antlr4,Antlr4,我们的语法允许用户通过ID(友好名称)或通过编辑器的索引指定标记。语法片段如下所示: tagindex : DOLLARDOLLAR 'TAGINDEX' ASSIGN tagid=INT DOLLARDOLLAR ; // A tag is either an ID or an INDEX tag : ID | tagindex ; 我们使用“tagindex”规则,因为它允许我

我们的语法允许用户通过ID(友好名称)或通过编辑器的索引指定标记。语法片段如下所示:

tagindex
 : DOLLARDOLLAR 'TAGINDEX' ASSIGN tagid=INT DOLLARDOLLAR
 ;

// A tag is either an ID or an INDEX
tag
: ID                            
| tagindex                          
;
我们使用“tagindex”规则,因为它允许我们轻松访问侦听器(EntertaIndex)和访问者(VisitTagindex)中的tagid(或yeah INT)标记,但这也意味着用户可以在每个标记之间输入空格,因为我们的语法跳过了空格

我们需要的是“tagindex”不接受任何空格,以便用户被迫输入,例如:

$$TAGINDEX=123$$

实现这一点的最佳方法是什么?

因为
tagindex
不是递归的,也不使用任何非终端规则,所以可以将其设置为终端规则。假设它不与任何其他规则重叠,则不会导致任何问题。

您的意思是将其更改为“TAGINDEX:DOLLARDOLLAR'TAGINDEX'ASSIGN tagid=INT DOLLARDOLLAR;”。我已经试过了,但是如果我这样做了,我就无法访问我的侦听器/访问者中的“tagid”,因为TAGINDEX是唯一的符号。然后,我必须解析TAGINDEX().GetText()来查找INT,我当然可以这样做,但我希望避免这样做。只是为了让ANTLR帮我做解析。@XBond恐怕有办法解析
GetText()
。ANTLR4似乎忽略了lexer规则中的标签,因此无法访问各个子模式。