4

在 smali 中,采用两个整数并返回一个整数的方法的签名是这样写的:

add(II)I

为了使用 xtext 解析它,我尝试了以下方法:

ID'('Type*')'Type

不幸的是,这只适用于两者之间的空白I

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


据我所知,这应该已经是词法分析器处理终端规则的问题了。每当它看到类似的字符序列时,III它总是立即将其标记为 ID。- 与职位无关。:(

解析类似:

III(III)I

即一个名为III取三个整数并返回另一个整数的函数,似乎我必须强制词法分析器始终只发出单个字符并使用解析器规则重新组合它。

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

好像错过了什么重要的事情。


I注意:除了像(integer)、D(double) 和(void) 这样的原始数据类型之外,V还有以 .Ljava/lang/String;开头的类类型和数组[

一个典型的 main 方法如下所示.method public static main([Ljava/lang/String;)V

4

2 回答 2

1

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

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

于 2013-08-24T14:44:32.197 回答
1

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

尝试以下方法:

  1. 将参数字符串(“III”)解析为 ID
  2. 添加一个验证器,将其限制为仅“I”,以及一个很好的错误消息(请参阅AbstractInjectableValidator,xText 将为您的语言生成一个验证器,可能称为“SmaliJavaValidator”)
  3. 扩展表示类型字符串的 EObject,因此它将在单独的类型描述中分解字符串(例如单个“I”)

使用这种方法,直到 xText 完成其语法后,您才解析类型字符串。您仍然可以获得可用的结果,具有快速的语法和良好的错误消息。

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

于 2013-08-27T07:55:40.740 回答