我正在使用 xtext 2.4。
我想做的是类似 SQL 的语法。
让我困惑的是我不确定哪些东西应该被视为终端/数据类型/解析器规则。到目前为止我的语法相关MyTerm
is:
Model:
(terms += MyTerm ';')*
;
MyTerm:
constant=MyConstant | variable?='?'| collection_literal=CollectionLiteral
;
MyConstant
: string=STRING
| number=MyNumber
| date=MYDATE
| uuid=UUID
| boolean=MYBOOLEAN
| hex=BLOB
;
MyNumber:
int=SIGNINT | float=SIGNFLOAT
;
SIGNINT returns ecore::EInt:
'-'? INT
;
SIGNFLOAT returns ecore::EFloat:
'-'? INT '.' INT;
;
CollectionLiteral:
=> MapLiteral | SetLiteral | ListLiteral
;
MapLiteral:
'{' {MapLiteral} (entries+=MapEntry (',' entries+=MapEntry)* )? '}'
;
MapEntry:
key=MyTerm ':' value=MyTerm
;
SetLiteral:
'{' {SetLiteral} (values+=MyTerm (',' values+=MyTerm)* )+ '}'
;
ListLiteral:
'[' {ListLiteral} ( values+=MyTerm (',' values+=MyTerm)* )? ']'
;
terminal MYDATE:
'0'..'9' '0'..'9' '0'..'9' '0'..'9' '-'
'0'..'9' '0'..'9' '-'
'0'..'9' '0'..'9'
;
terminal HEX:
'a'..'h'|'A'..'H'|'0'..'9'
;
terminal UUID:
HEX HEX HEX HEX HEX HEX HEX HEX '-'
HEX HEX HEX HEX '-'
HEX HEX HEX HEX '-'
HEX HEX HEX HEX '-'
HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX
;
terminal BLOB:
'0' ('x'|'X') HEX+
;
terminal MYBOOLEAN returns ecore::EBoolean:
'true' | 'false' | 'TRUE' | 'FALSE'
;
几个问题:
如何定义带符号的整数?如果我定义另一个终端规则terminal SIGNINT: '-'? '0'..'9'+;
,antlr 会抱怨 INT 无法访问。因此我将其定义为数据类型规则SIGNINT: '-'? INT;
这是正确的方法吗?
如何用符号定义浮点数?我所做的与定义带符号的整数完全相同,SIGNFLOAT: '-'? INT '.' INT;
,不确定这是否也正确。
如何定义日期规则?我想使用解析器规则在字段中存储年/月/日信息,但将其定义为MyDate: year=INT '-' month=INT '-' date=INT;
antlr会抱怨Decision can match input such as "RULE_INT '-' RULE_INT '-' RULE_INT" using multiple alternatives: 2, 3
As a result, alternative(s) 3 were disabled for that input
我还有一些其他规则,例如
下列
RelationCompare:
name=ID compare=COMPARE term=MyTerm
;
but a=4
将不是有效的RelationCompare
因为a
and 4
将被视为HEX
s。我发现这是因为如果我将关系更改为j=44
然后就可以了。在这个post http://zarnekow.blogspot.com/2012/11/xtext-corner-6-data-types-terminals-why.html它说早期定义的最终规则将影响后来定义的最终规则。但是,如果我重新定义terminal ID
在我的语法中,无论是放在...前面还是后面terminal HEX
,antlr会抱怨The following token definitions can never be matched because prior tokens match the same input: RULE_HEX,RULE_MYBOOLEAN
。这个问题发生在k=0x00b
以及。k=0xaab
是有效的,但是k=0x00b
is not.
有什么建议吗?
如何定义带符号的整数?
- 将其视为两个单独的令牌
'-'
and INT
,并使用解析器规则而不是词法分析器规则。
如何定义带有符号的浮点数?
- 将其视为两个单独的令牌
'-'
and FLOAT
,并使用解析器规则而不是词法分析器规则。
如何定义日期规则?
- 将其视为五个单独的标记,并使用解析器规则而不是词法分析器规则。
我不知道最后一个问题的答案,因为这是在 Xtext 中而不是在 ANTLR 中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)