ANTLR4的Delphi语法问题

ANTLR4的Delphi语法问题,delphi,grammar,antlr4,delphi-xe,Delphi,Grammar,Antlr4,Delphi Xe,我找到了一个用于Delphi的工具,我正在尝试将其转换为ANTLR4。但我有一个奇怪的问题,我不明白。我已经创建了一个回购协议 大多数想法似乎有效,但如果我有一个简单的单元,具有以下内容: unit TestParser; interface procedure Dim(var dd: string; const Dim1: Integer; const Dim2: Integer); overload; implementation procedure Dim(var dd: stri

我找到了一个用于Delphi的工具,我正在尝试将其转换为ANTLR4。但我有一个奇怪的问题,我不明白。我已经创建了一个回购协议

大多数想法似乎有效,但如果我有一个简单的单元,具有以下内容:

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.
当找到第一个过程关键字时,将在interfaceDecl中调用procDecl。但是,一旦var和/或const i到达,它就会中断procDecl并启动varSection/constSection,而不是完成procDecl


我必须承认,我是ANTLR的新手,因此任何帮助都将不胜感激

整个问题取决于变量名
dd

似乎出于某种原因,解析器将其误认为是十六进制数。当您将名称更改为类似
123
的名称时,也会得到相同的效果

只要更改名称,使其不会被误认为是数字(例如,只需添加一个g-z范围内的字符),一切正常。但我无法解释为什么会发生这种情况


顺便说一句:感谢Delphi.g4。

首先,尝试修复语法中的所有警告,例如
规则包含一个可选块,其中至少有一个可选块可以匹配空字符串。
。您是否尝试修改并使用官方语法库中的语法?在使用此语法解析“函数f:Integer”时,我遇到了类似问题. 有一些特定于汇编程序的标记会干扰语言的其余部分,在我的例子中,这导致f:被识别为TkAsmHexLabel。lexer不知道更好,我也不知道是否有办法让它知道ANTLR中的上下文。另一种方法是删除所有特定于asm的规则,并将其替换为从“asm”到第一个“end”的单个asm规则。如果感兴趣,请使用单独的语法来解析检索到的asm规则的文本,否则就忽略它。