2014-12-03 113 views
2

我建立以下语法:ANTLR的预测-LL(*)解析机制

Letter  : 'a'..'z'|'A'..'Z'  ; 

Number  : '0'..'9'  ; 

Float 
    : Number+ '.' Number+ 
    ; 

a5 
@init 
{ 
int n = 1; 
} 
: ({n<=5}?=>(Letter|Number){n++;})+ 
; 

它没有成功解析字符串“CD923IJK”,因为我需要被消费“CD923”,而不是“CDIJK “就像如果浮子评论问题消失和消费发生

‘CD923’像我想要

显然需要一种先进的分析,因为这个语法LL(K),我设定先行深度

options 
{ 
k=5; 
} 

但是没有解决任何问题。任何想法?

UPDATE

响应于建议500 - Internal Server Error 添加以下规则

public test :a5 Float ; 

我需要匹配CD9231.23其中CD923是字母数字和1.23的浮子。但见解析树: enter image description here

+1

这是你真正的语法和输入?这是我没有看到'浮动'规则如何匹配任何输入,因为你没有一个点。 – 2014-12-03 20:11:41

+0

@ 500-InternalServerError这是我的语法片段。问题是为什么发生这种情况。为什么“123”被跳过并在链条后面的3个字母中消耗? – Cyberguille 2014-12-05 14:11:25

+0

我的建议是将语法缩减为您可以在此处完整发布的内容以及失败的输入。 – 2014-12-05 14:26:52

回答

1

问题似乎在规则数字和浮点数。你在这两条规则中有一个不明确的地方,但由于Number和Float都是词法规则,所以你必须记住antlr隐式地创建一个nextToken规则来处理所有的标记。该的nextToken的例子是这样的:

nextToken: Letter | Number | Float; 

当ANTLR找到一个数字,他通过DFA步行至哪个治跳,但在这种情况下,他不能确定哪些是正确的规则(或数浮动)跳转到。您可以避免使Float规则成为解析器规则的行为。你可以试试这样的:

grammar a5; 

s : a5 coordinate? 
    ; 

a5 
@init{ 
int n = 0; 
} 
: ({n<5}?=> (LETTER|Number){n++;})+ 
; 


Number : '0'..'9' 
    ; 

coordinate : Number+ '.' Number+ 
    ; 

LETTER 
    : 'a'..'z'|'A'..'Z' 
    ; 
1

我想,也许你可以做一个简单的解决方案:如果你知道你的A5规则的项目始终将大小5的文本或更少,你可以根据所编写规则:

A5 
: (Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number) 
    | (Letter|Number) 
; 

其他的解决办法是让规则没有考虑帐户的lenthg,然后检查它在语义阶段:

AK 
    : (Letter|Number)+ 
; 

这有一些想法,希望可以帮助...