用不完整的语法进行解析

ANT*_*ter 5 grammar parsing antlr antlrworks parser-generator

有没有任何常见的解决方案如何使用不完整的语法?在我的情况下,我只想检测Delphi(Pascal)文件中的方法,这意味着proceduresfunctions.以下第一次尝试正在进行中

    methods
      : ( procedure | function | . )+
      ;
Run Code Online (Sandbox Code Playgroud)

但这是一个解决方案吗?还有更好的解决方案吗?是否可以通过动作停止解析(例如,在检测之后implementation).使用预处理器是否有意义?什么时候 - 如何?

Bar*_*ers 4

如果您只想查找名称,那么就像这样简单:

grammar PascalFuncProc;

parse
  :  (Procedure | Function)* EOF
  ;

Procedure
  :  'procedure' Spaces Identifier
  ;

Function
  :  'function' Spaces Identifier
  ;

Ignore
  :  (StrLiteral | Comment | .) {skip();}
  ;

fragment Spaces     : (' ' | '\t' | '\r' | '\n')+;
fragment Identifier : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;
fragment StrLiteral : '\'' ~'\''* '\'';
fragment Comment    : '{' ~'}'* '}';
Run Code Online (Sandbox Code Playgroud)

会成功的。请注意,我对 Delhpi/Pascal 不是很熟悉,所以我肯定会弄错StrLiterals 和/或Comments,但这很容易修复。

从上面的语法生成的词法分析器只会生成两种类型的标记(Procedures 和Functions),其余输入(字符串文字、注释或如果没有匹配的情况,则单个字符: the .)将立即从词法分析器中丢弃(方法skip())。

对于这样的输入:

some valid source
{ 
  function NotAFunction ...
}

procedure Proc
Begin
  ...
End;

procedure Func
Begin
  s = 'function NotAFunction!!!'
End;
Run Code Online (Sandbox Code Playgroud)

创建以下解析树:

在此输入图像描述