2011-05-20 88 views
0

我正在写一个C#语法的非常简单的子集作为练习。ANTLR中的标记之间没有空格

但是,我有一个规则,空白给我一些麻烦。

我要区分以下:

int a; 
int? b; 

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

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

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

typeBase : 'int' 
     | 'float' 
     ; 

的事情是,蒙山这些规则,它只能与前一个空白的作品,这样的“?”:

int ? a; 

哪个我不想要的。

任何想法?

+1

'type'中的重写规则不正确:您应该有两个重写规则。另外,不应该这个“?”是可选的吗?现在,它必须包含一个''?''。 – 2011-05-20 11:36:03

+1

总之,如果没有重写规则,'int?'和'int?'都会被正确解析。 – 2011-05-20 11:53:17

回答

2

1)你对空白的定义似乎是有缺陷的...你出现的语法应该接受“int?”和“int?”。也许你应该看看空白的定义。 2)如果你想不允许“int?a”,你可以定义额外的标记'int?'和'漂浮?' ...通常你会在每个令牌之间出现空格,所以你必须让它成为一个令牌。

+1

是的,如果在类型和问号之间不允许有空格,那么定义额外的标记如'int?','float?'等将成为方法。 #1是正确的:生成的解析器接受'int?'和'int?'。 – 2011-05-20 11:54:09

相关问题