0

我正在尝试构建一个解析器,它可以采用人类语言表达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...;

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

这可能吗?

4

1 回答 1

1

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

如果你使用类似的东西

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

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

于 2012-11-08T17:22:18.367 回答