ANTLR 如何在语法中创建可选空格?

问题描述 投票:0回答:1

我们正在为一种语言编写 ANTLR 语法,并希望删除可选空格。

例如,假设我有以下函数调用类型的东西:

f(x=2)

我们希望每个token前后可以定义任意个空格(包括没有空格),这样下面的都是合法的

f ( x = 2 )
f    (    x = 2)
f (
  x =
2 )

定义一个被忽略的空格标签 S 似乎很自然,因为我们不关心它在哪里。

这应该如何在 ANTLR 中完成?下面的 mwe 创建了一个片段 S,但是每当 S 被放入不是令牌的产生式中时,ANTLR 就会抱怨。

grammar mwe;

func: 'f' S '(' S VAR S '=' S VAL ')' S
    ;

VAR:        [a-zA-Z]+;
VAL:        [a-zA-Z0-9]+;
fragment S: [ \t\n]*;
parsing antlr
1个回答
1
投票

fragment
用于设置部分 Lexer 规则以用于关闭 Lexer 规则。所以你真的不想
fragment
为你的
S
规则。

你要找的是

skip
指令。这告诉 ANTLR 创建令牌,但在评估解析器规则时“跳过”该令牌。这意味着您不需要指定所有的。
S
标记可能出现在解析器规则中的位置。

尝试:

grammar mwe;

func: 'f' '(' VAR '=' VAL ')'
    ;

VAR:        [a-zA-Z]+;
VAL:        [a-zA-Z]+;
S: [ \t\n]* -> skip;
© www.soinside.com 2019 - 2024. All rights reserved.