À l'école, on nous a demandé de concevoir un langage puis de le mettre en œuvre (je m'amuse tellement à le mettre en œuvre =)). Mon professeur nous a dit d'utiliser yacc/lex, mais je décide d'aller avec Java + API regex, voici comment la langue que je conçu ressemble:Question de l'analyse de la syntaxe
Program "my program"
var yourName = read()
if { equals("guy1" to yourName) }
print("hello my friend")
else
print("hello extranger")
end
Program End
Eh bien, comme vous pouvez le voir, son une langue assez basique =).
Je pensais que je pouvais le mettre en œuvre de façon très POO, comme faire une classe abstraite Sentence
et ensuite les sous-classes comme VariableAssignment
, IfSentence
etc, et ont une classe Program
qui est seulement un tas de phrases à droite? Et puis appeler une méthode abstraite eval
sur tous les Sentence
s, donc ma première approche complie la langue ne se composait que de deux phases:
- IDENTIFY Syntaxe de la ligne de seach
- Créer la classe correspondig pour chaque ligne
bien sûr, si quelque chose se passe mal sur une phase Ii pourrait générer une erreur. Ma question est: est-ce que je me trompe? Dois-je passer en revue toutes les phases comme le dit la théorie (lexicale, syntaxique, sémantique)? Devrais-je continuer avec mon compilateur naïf à deux phases?
Grosse erreur. Vous devriez apprendre à analyser et au lieu de cela vous vous amusez avec des expressions régulières. Vous devriez passer à l'utilisation d'un système d'analyse Java tel que Jack ou, mieux encore, utiliser BYACC/J http://byaccj.sourceforge.net/ afin que vous soyez plus en phase avec la classe. –