解析参数而不分隔空格

时间:2013-08-18 23:37:37

标签: eclipse parsing xtext

在smali中,采用两个整数并返回一个整数的方法的签名如下所示:

add(II)I

为了使用xtext解析它,我尝试了以下内容:

ID'('Type*')'Type

不幸的是,这仅适用于两个I之间的空格。

如何更改规则以使其不在此处坚持空白?


据我所知,这应该是词法分析器处理终端规则的问题。每当它看到像III这样的字符序列时,它总会立即将其标记为ID。 - 独立于职位。 :(

解析类似的内容:

III(III)I

即。一个名为III的函数接受三个Integers并返回另一个Integer,似乎我必须强制lexer始终只发出单个字符并使用解析器规则重新组装它。

但在这种情况下,我不再设法创建ID规则......

似乎我错过了一些重要的事情。


注意:除I(整数),D(double)和V(void)等原始数据类型外,还有类Ljava/lang/String;和数组编写的类类型以[开头。

典型的主要方法如下.method public static main([Ljava/lang/String;)V

2 个答案:

答案 0 :(得分:1)

您可能希望尝试配置生成语言的mwe2工作流以使用扩展AntlrGeneratorFragment,您可以在其中设置选项以在词法分析器中使用回溯。这应该够了吧。您必须对内容辅助解析器片段执行相同的操作,您需要ContentAssistParserGeneratorFragment

一些背景:词法分析器通常会消耗最长的匹配序列,例如: III看起来像一个ID,因此它将作为单个ID而不是三个单独的令牌I使用。如果启用了回溯,则会将其拆分而不是使用完整的ID。如果III不总是类型列表但有时候是真实ID,这可能会带来一些困难,但您可以通过使用有效标识符的数据类型规则来规避这些。

答案 1 :(得分:1)

你可以尝试回溯,但我通常会避免这种技术。它可能导致非常混乱的错误消息,并且可能导致生成非常慢的解析器。

尝试以下方法:

  1. 将参数字符串(“III”)解析为ID
  2. 添加一个验证器,将其限制为只有“我”,并附带一条好的错误消息(请参阅AbstractInjectableValidator,xText将为您的语言生成一个验证器,可能称为“SmaliJavaValidator”)
  3. 扩展表示类型字符串的EObject,因此它会在单个类型描述中打破字符串(例如单个“I”)
  4. 使用这种方法,您可以解析类型字符串,直到xText完成其语法。您仍然可以获得可用的结果,语法快速且错误消息良好。

    一般建议:我通常倾向于使我的语法非常宽松,并且稍后使用验证器限制结果。因此语法保持快速,用户可以获得良好的自定义taylored错误消息。