ANT*_*ter 5 grammar parsing antlr antlrworks parser-generator
有没有任何常见的解决方案如何使用不完整的语法?在我的情况下,我只想检测Delphi(Pascal)文件中的方法,这意味着procedures和functions.以下第一次尝试正在进行中
methods
: ( procedure | function | . )+
;
Run Code Online (Sandbox Code Playgroud)
但这是一个解决方案吗?还有更好的解决方案吗?是否可以通过动作停止解析(例如,在检测之后implementation).使用预处理器是否有意义?什么时候 - 如何?
如果您只想查找名称,那么就像这样简单:
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)
创建以下解析树:

| 归档时间: |
|
| 查看次数: |
865 次 |
| 最近记录: |