在Xtext中解析不同的范围整数?

时间:2015-03-26 21:57:47

标签: parsing antlr xtext

我是xText的新手,我几天前安装过,这可能看起来像一个简单的问题,但我还没有找到解决方案,而且我一直在关注Google。

基本上我想定义一个程序集自定义语言。

以下是我的定义:

grammar org.comp.language.ASAWriter with org.eclipse.xtext.common.Terminals

generate aSAWriter "http://www.comp.org/language/ASAWriter"

ASAWriter :
(ModeloASA += Instructions)* 
;


Instructions:
    readInteger|readSmallInteger|readMediumInteger
    ;

readMediumInteger:
    'RMI' Register '-' MEDIUMINT ';'
;

readInteger:
    'RI' Register '-' INT ';'
;

readSmallInteger:
    'RSI' Register '-' SMALLINT ';'
;


Register:
'REG0'|'REG1'|'REG2'|'REG3'|'REG4'  
;


terminal SMALLINT:
    '1'|'2'|'3'
;

terminal MEDIUMINT:
    '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'10'
;

我的问题是,当我输入以下内容时:

RI REG0-2;

这应该是一个有效的指令,(Operation Register-Integer),但是我收到以下错误: 输入'2'不匹配,期待RULE_INT

基本上问题是数字'2'被消耗但是SMALLINT而不是INT。

有关如何解决此问题的任何想法?或者我的方法是否正确?

1 个答案:

答案 0 :(得分:0)

词法分析器独立于解析器运行。 <{1}}将始终被解析为2,因为该规则首先出现。

将其作为解析器规则处理:

SMALLINT

或者根本不在你的解析器中处理它。相反,将所有数字解析为mediumint: SMALLINT_TOKEN | MEDIUMINT_TOKEN; SMALLINT_TOKEN: '1'..'3' ; MEDIUMINT_TOKEN: '4'..'10' ; s,然后检查抽象语法树/解析逻辑中的数字是否过大。