Xtext在解析期间分配值

时间:2012-11-07 12:05:49

标签: xtext

我正在尝试构建一个可以使用twenty five percent等人类语言表达式的解析器,并将其转换为25%之类的数字。

基本上我有这样的规则:

Number:
    (T1 | T2 | T3 T1) 'percent'?
;

terminal T1: 'zero' | 'one' | 'two' etc....;
terminal T2: 'ten' | 'eleven' | 'twelve' etc...;
terminal T3: 'twenty' | 'thirty' | 'forty' etc...;

我想以某种方式对其进行转换,以便当我在Xtend中访问Number以生成我的代码时,它不会像twenty five percent这样的文本,但它将是一个数字。

这可能吗?

1 个答案:

答案 0 :(得分:1)

您将Number定义为返回String的数据类型规则。

如果您使用类似

的内容
Number returns ecore::EBigDecimal:
  (T1 | T2 | T3 T1) 'percent'?
;

您可以为规则Number定义值转换器,并将其转换为BigDecimal的实际实例。规则编号的被调用者将其视为BigDecimal。有关Xtext中值转换的详细信息,请参阅docs。请记住,您必须为此目的导入Ecore包。如果您对此有疑问,请查看常用终端和文档。