在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
。
答案 0 :(得分:1)
您可能希望尝试配置生成语言的mwe2工作流以使用扩展AntlrGeneratorFragment,您可以在其中设置选项以在词法分析器中使用回溯。这应该够了吧。您必须对内容辅助解析器片段执行相同的操作,您需要ContentAssistParserGeneratorFragment。
一些背景:词法分析器通常会消耗最长的匹配序列,例如: III
看起来像一个ID,因此它将作为单个ID而不是三个单独的令牌I
使用。如果启用了回溯,则会将其拆分而不是使用完整的ID。如果III不总是类型列表但有时候是真实ID,这可能会带来一些困难,但您可以通过使用有效标识符的数据类型规则来规避这些。
答案 1 :(得分:1)
你可以尝试回溯,但我通常会避免这种技术。它可能导致非常混乱的错误消息,并且可能导致生成非常慢的解析器。
尝试以下方法:
使用这种方法,您可以解析类型字符串,直到xText完成其语法。您仍然可以获得可用的结果,语法快速且错误消息良好。
一般建议:我通常倾向于使我的语法非常宽松,并且稍后使用验证器限制结果。因此语法保持快速,用户可以获得良好的自定义taylored错误消息。