我正在尝试构建一个可以使用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
这样的文本,但它将是一个数字。
这可能吗?
答案 0 :(得分:1)
您将Number定义为返回String的数据类型规则。
如果您使用类似
的内容Number returns ecore::EBigDecimal:
(T1 | T2 | T3 T1) 'percent'?
;
您可以为规则Number
定义值转换器,并将其转换为BigDecimal
的实际实例。规则编号的被调用者将其视为BigDecimal
。有关Xtext中值转换的详细信息,请参阅docs。请记住,您必须为此目的导入Ecore包。如果您对此有疑问,请查看常用终端和文档。