2015-03-31 77 views
0

编辑:我更改了示例以更好地解释我想要获得的内容。 这是我的语法:ANTLR中的语法和选定的词

INTEGER : ' int '; 
LET : [a-z] ; 
cchar : LET | '-' | ' ' ; 
wor : cchar+; 
aaa : wor+ | wor* INTEGER wor* ; 

aaa是根。写例如:'xx int xx int'。 我想得到一个结果:'x x int x x i n t'。只有第一个int应该被捕获,下一个不应该给出“无关输入”的错误,而是被分解为字母。

我该如何解决?

+0

这是整个语法?还是有更多的语法? – 2015-03-31 21:06:41

+0

我改变了一点点 – Annabelle 2015-03-31 22:59:35

+0

Annabelle,我想我们需要更多的细节。是aaa的根本规则?你需要解析什么? – 2015-04-01 07:42:55

回答

0

这似乎工作,因为你想:

LET : [a-z]; 
INT : 'int '; 

cchar : LET | '-' | ' '; 
wor: cchar+; 

int_string: INT; 

aaa: (wor|int_string)+; 

这是什么语法说的是:alow我一个字或一个整数声明,其中integer是一个声明,如果它是“诠释”后面有一个空格定义为一个词法分析器项目,其他一切都是单词。

下面的配置不起作用:

LET : [a-z]; 
INT : 'int'; 

cchar : LET | '-' | ' '; 
wor: cchar+; 

int_string: INT ' '; 

aaa: (wor|int_string)+; 

移动空间的语法规则,而不是词法规则后,它无法解析“INTT”例如,其实有一个“诠释”的任何单词子。它发生是因为词法分析器部分似乎读取任何发生的'INT'作为INT,甚至wor现在不会将'intt'解析为字符串,它会尝试匹配(wor int (cchar t)),并且由于某种原因它不会与'int'匹配为单独的cchars 。

第一个例子的wor规则将'intt'解析为(wor (cchar i) (cchar n) (cchar t) (cchar t))。这是有道理的。第一个示例的语法在词法分析阶段无法匹配,因为词法分析规则INT所需的空格字符在'intt'中不存在。

它为什么这样做?我认为这是因为词法分析器在解析器之前运行,而解析器得到的是已经相当的语义。即使在第二个示例中用中的'int'代替词法分析器规则INT也会产生与我预期的相同的行为antlr仅为该匹配生成隐藏词法分析器规则。不是100%确定。

告诉我,这会有所帮助,如果我想出了一个办法来解决第二种情况,我会让编辑:)