【问题标题】:No spaces between tokens in ANTLRANTLR 中的标记之间没有空格
【发布时间】:2011-05-20 11:24:44
【问题描述】:

我正在编写一个非常简单的 C# 语法子集作为练习。

但是,我有一个规则,其中空格给我带来了一些麻烦。

我想区分以下几点:

int a;
int? b;

第一个是“常规”int 类型,第二个是可为空的 int 类型。

但是,以我目前的语法,我无法解析这个。

type     : typeBase x='?'    -> { x == null } typeBase
                             -> ^('?' typeBase)
         ;

typeBase : 'int'
         | 'float'
         ;

问题是,有了这些规则,它只适用于“?”之前的空格,如下所示:

int ? a;

我不想要的。

有什么想法吗?

【问题讨论】:

  • type 中的重写规则不正确:您有两个重写规则,而应该有一个。另外,这个'?' 不应该是可选的吗?现在,它必须始终包含 '?'
  • 无论如何,如果没有重写规则,int?int ? 都可以正确解析。

标签: antlr antlr3


【解决方案1】:

1)您对空格的定义似乎有缺陷……您提出的语法应该接受“int?”和“int?”。也许你应该看看空白的定义。

2) 如果你想禁止 "int ? a" 你可以定义额外的标记 'int?'和“浮动?” ...通常您允许在每个标记之间出现空格,因此您必须将其设为一个标记。

【讨论】:

  • 是的,如果类型和问号之间不允许有空格,则可以定义额外的标记,如int?float? 等。 #1 是正确的:int?int ? 都被生成的解析器接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多