我是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。
有关如何解决此问题的任何想法?或者我的方法是否正确?
答案 0 :(得分:0)
词法分析器独立于解析器运行。 <{1}}将始终被解析为2
,因为该规则首先出现。
将其作为解析器规则处理:
SMALLINT
或者根本不在你的解析器中处理它。相反,将所有数字解析为mediumint: SMALLINT_TOKEN | MEDIUMINT_TOKEN;
SMALLINT_TOKEN:
'1'..'3'
;
MEDIUMINT_TOKEN:
'4'..'10'
;
s,然后检查抽象语法树/解析逻辑中的数字是否过大。