Si vous ne cherchez que des noms, alors quelque chose d'aussi simple que ceci :
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 : '{' ~'}'* '}';
fera l'affaire. Notez que je ne suis pas très familier avec Delhpi/Pascal, donc je me trompe sûrement. StrLiteral
et/ou Comment
mais cela sera facilement corrigé.
Le lexateur généré à partir de la grammaire ci-dessus ne produira que deux types de jetons ( Procedure
et Function
), le reste de l'entrée (chaînes de caractères, commentaires ou, si rien n'est trouvé, un seul caractère : l'option .
) est immédiatement éliminé du lexateur (la balise skip()
).
Pour une entrée comme celle-ci :
some valid source
{
function NotAFunction ...
}
procedure Proc
Begin
...
End;
procedure Func
Begin
s = 'function NotAFunction!!!'
End;
l'arbre d'analyse suivant est créé :