ANTLR4中Delphi语法的问题

3
我发现了一个Delphi的ANTLR3语法,链接如下:ANTLR3 Delphi Grammar,我正在尝试将其转换为ANTLR4。但是我遇到了一个奇怪的问题,我无法理解。我创建了一个仓库,里面包含ANTRL4 Delphi语法
大部分东西似乎都能正常工作,但如果我有一个简单的单元包含以下内容:
unit TestParser;

interface

procedure Dim(var dd: string; const Dim1: Integer; const Dim2: Integer); overload;

implementation

procedure Dim(var dd: string; const Dim1: Integer; const Dim2: Integer); overload;
begin
  //do something
end;

end.

当遇到第一个procedure关键字时,会在interfaceDecl中调用procDecl。但是一旦到达var和/或const,它就会中断procDecl并开始varSection / constSection,而不是完成procDecl。

我必须承认,我对ANTLR还比较陌生,所以任何帮助都将不胜感激。


首先,尝试修复所有语法警告,例如“规则包含一个可选块,其中至少有一个可替代项可以匹配空字符串”。 - Ivan Kochurkin
你尝试过修改并使用来自官方语法库的pascal.g4语法吗? - Ivan Kochurkin
1个回答

0
整个问题取决于变量名 dd
似乎由于某种原因,解析器会错误地将其识别为十六进制数。当您将名称更改为类似 123 的内容时,会出现相同的效果。
只要您更改名称,以便它不会被误认为是数字(例如,只需添加来自g-z范围的字符),一切就没问题了。但我无法解释为什么会发生这种情况。
顺便说一下:感谢 Delphi.g4。

1
当我使用这个语法来解析“function f: Integer”时,我遇到了类似的问题。有一些汇编特定的标记会干扰其他语言的识别,这在我的情况下导致f:被识别为TkAsmHexLabel。词法分析器不知道更好的方法,而且我不知道是否有办法让它意识到ANTLR上下文。另一种选择是删除所有asm特定规则,并用一个从'asm'读取到第一个'end'的单独的asm规则替换它们。如果感兴趣,可以使用单独的语法来解析检索到的asm规则的文本,否则可以忽略它。 - Paul
1
我只是把TkAsmHexLabel规则注释掉了,然后就可以工作了。 - Ramu.R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接