antlr - xtext 中的终端/数据类型/解析器规则

标签 antlr xtext

我正在使用 xtext 2.4。 我想做的是类似 SQL 的语法。 让我困惑的是我不确定哪些东西应该被视为终端/数据类型/解析器规则。到目前为止,我与 MyTerm 相关的语法是:

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; 这是正确的方法吗?

  • 如何定义带符号的 float ?我所做的与用符号定义整数完全相同, SIGNFLOAT: '-'? INT '.' INT;,也不知道是不是这样。

  • 如何定义日期规则?我想使用解析器规则在字段中存储年/月/日信息,但将其定义为 MyDate: year=INT '-' month=INT '-' date=INT; antlr 会提示Decision 可以匹配输入,例如“RULE_INT '-' RULE_INT '-' RULE_INT”,使用多个备选方案:2、3 因此,该输入的备选方案 3 被禁用

  • 我还有一些其他规则,比如

以下

RelationCompare:
    name=ID compare=COMPARE term=MyTerm
;

a=4 将不是有效的 RelationCompare 因为 a4 将被视为十六进制。我发现这个是因为如果我更改与 j=44 的关系,它就会起作用。在这个post它说终端规则定义的eariler将影响那些后来定义的。但是,如果我在我的语法中重新定义terminal ID,无论是放在terminal HEX的前面还是后面,antlr都会提示The following token definitions can never be matched因为先前的标记匹配相同的输入:RULE_HEX,RULE_MYBOOLEAN。此问题也发生在 k=0x00b 中。 k=0xaab 有效,但 k=0x00b 无效。

有什么建议吗?

最佳答案

如何定义带符号的整数?

  • 将其视为两个单独的标记 '-'INT,并使用解析器规则而不是词法分析器规则。

如何定义带符号的 float ?

  • 将其视为两个单独的标记 '-'FLOAT,并使用解析器规则而不是词法分析器规则。

如何定义日期规则?

  • 将其视为五个单独的标记并使用解析器规则而不是词法分析器规则。

我不知道最后一个问题的答案,因为这是在 Xtext 中,而不仅仅是 ANTLR。

关于antlr - xtext 中的终端/数据类型/解析器规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18089514/

相关文章:

java - ANTLR 4 (Java) 捕获解析器错误/异常以进行测试

java - 期待 ANTLR 中的 NEWLINE

eclipse - Xtext 与 GMF 集成

c - 对于决策错误,调试 Xtext 甚至无法执行 k=1

java - 使用 Xtext 生成的 Artifact

ANTLRv3 不读取选项

antlr - 在ANTLR中,如何指定特定的重复次数?

c - ANTLR:意想不到的角色

eclipse - XText2 采用和迁移

java - Eclipse 将 XText 编辑器添加到透视图