在smali中,采用两个整数并返回一个整数的方法的签名如下所示:
add(II)I
为了使用xtext解析它,我尝试了以下方法:
ID'('Type*')'Type
不幸的是,这仅适用于两者之间的空白.
如何更改规则以使其不坚持空白?
据我所知,这应该是词法分析器处理终端规则的问题.每当它看到像III这样的字符序列时,它总是立即将其标记为ID. – 独立于职位. 🙁
解析类似的东西:
III(III)I
即一个名为III的函数接受三个Integers并返回另一个Integer,似乎我必须强制lexer始终只发出单个字符并使用解析器规则重新组合它.
但在这种情况下,我不再设法创建ID规则了…
好像我错过了重要的事情.
注意:除了原始数据类型(如I(整数),D(双)和V(void))之外,还有类型写为Ljava / lang / String;和以[开头的数组.
典型的主要方法如下所示.method public static main([Ljava / lang / String;)V.
最佳答案 您可能希望尝试配置生成语言的mwe2工作流以使用扩展
AntlrGeneratorFragment,您可以在其中设置选项以在词法分析器中使用回溯.这应该够了吧.您必须对内容辅助解析器片段执行相同的操作,您必须使用
ContentAssistParserGeneratorFragment.
一些背景:词法分析器通常会消耗最长的匹配序列,例如: III看起来像一个ID,因此它将作为单个ID而不是三个单独的令牌I使用.如果启用了回溯,它会将其拆分而不是使用完整的ID.如果III不总是类型列表但有时是真实ID,则可能会带来一些困难,但您可以通过使用有效标识符的数据类型规则来规避这些.