2009-09-17 5 views
6

Je suis novice dans le domaine des analyseurs syntaxiques et je me demande comment pourrait ressembler la grammaire ANTLR pour un langage embarqué comme JSP/ASP/PHP, mais malheureusement le site ANTLR ne fournit pas de tels fichiers grammaticaux. Plus précisément, je ne sais pas exactement comment définir un jeton AnyText qui corresponde à tout (y compris les mots-clés qui n'ont pas de sens en dehors des blocs de code) tout en étant capable de les reconnaître correctement dans les blocs. Par exemple, le code suivant devrait être symbolisé comme suit: AnyText, BlockBegin, Keyword, BlockEnd, AnyText.Comment écrire un analyseur ANTLR pour les langages JSP/ASP/PHP?

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet 

Peut-être qu'il existe aussi un autre générateur d'analyseur qui convient mieux à mes besoins. J'ai seulement essayé ANTLR jusqu'à maintenant, en raison de son énorme popularité ici à stackoverflow :)

Un grand merci d'avance!

+1

Toute chance d'obtenir ce travail – etheros

Répondre

3

Je ne peux pas parler pour ANTLR, car j'utilise un autre lexer/analyseur (le DMS Software Reengineering Toolkit, pour lequel j'ai développé précisément de tels analyseurs/analyseurs JSP et PHP.) (ASP n'est pas différent comme vous l'avez observé dans votre question)

Mais l'idée de base est que le lexeur a besoin de modes lexicaux pour reconnaître quand vous prenez "anytext" et quand vous traitez du texte de langage de programmation "réel". HTML, dont le travail est d'absorber le texte HTML , et quand il rencontre une transition en PHP, change de mode Vous avez également besoin d'un mode PHP qui ramasse tous les jetons PHP, et repasse en mod HTML e lorsque les caractères de transition sont rencontrés. Voici un croquis:

%%HTML -- mode 
#token HTMLText "~[]* \< \% " 
    << (GotoPHPMode) >> 

%%PHP -- mode 
#token KEYWORD "KEYWORD" 
... 
#token '%>' "\%\>" 
    << (GotoHTMLMode) >> 

Votre générateur de lexer est susceptible d'avoir une sorte de capacité de commutation en mode que vous devrez utiliser au lieu de cela. Et vous trouverez probablement que lexing les choses HTML est plus compliqué qu'il n'y paraît (vous avez à vous soucier au sujet < balises SCRIPT et beaucoup d'autres choses folles HTML, mais ce sont détails que je suppose que vous pouvez manipuler.

+0

un grand merci pour votre réponse Le changement de mode pourrait?. être en effet une solution , même si c'est encore un peu problématique avec ANTLR, car seul le lexer doit être changé et l'analyseur doit rester le même. (Sinon, il serait difficile d'analyser des choses comme "<% for ... %> AnyText <% endfor %>"). La solution la plus simple que j'ai exploré est l'utilisation de boost :: spirit. Là, le lexer est appelé par l'analyseur et donc vous pouvez écrire autant de règles, y compris anychar_p que vous voulez, sans changer de mode. – tux21b

1

Je suis venu dans ce projet http://code.google.com/p/phpparser/ qui contient également un fichier de grammaire ANTLR pour l'analyse syntaxique PHP:. http://code.google.com/p/phpparser/source/browse/grammar/Php.g

Hope this helps

+0

J'ai déjà réussi à le faire dans goyacc avec un lexer personnalisé qui bascule son mode de lexage dès qu'il rencontre un tel token de début/fin. Mais merci beaucoup pour votre lien de toute façon, je vais le regarder aussi :) – tux21b

Questions connexes