Étant donné un LL (1) grammaire qu'est-ce qu'une structure de données ou un algorithme approprié pour produire un arbre de syntaxe concret immuable d'une manière fonctionnellement pure? N'hésitez pas à écrire un exemple de code dans la langue que vous préférez.Qu'est-ce qu'une structure de données ou un algorithme approprié pour produire un arbre de syntaxe concret immuable d'une manière fonctionnellement pure?
Mon idée
symbol : either a token or a node result : success or failure token : a lexical token from source text value -> string : the value of the token type -> integer : the named type code of the token next -> token : reads the next token and keeps position of the previous token back -> token : moves back to the previous position and re-reads the token node : a node in the syntax tree type -> integer : the named type code of the node symbols -> linkedList : the symbols found at this node append -> symbol -> node : appends the new symbol to a new copy of the node
Voici une idée que j'ai pensé à. Le problème principal ici est de gérer les erreurs de syntaxe. Je veux dire que je pourrais arrêter à la première erreur mais cela ne semble pas correct.
let program token =
sourceElements (node nodeType.program) token
let sourceElements node token =
let (n, r) = sourceElement (node.append (node nodeType.sourceElements)) token
match r with
| success -> (n, r)
| failure -> // ???
let sourceElement node token =
match token.value with
| "function" ->
functionDeclaration (node.append (node nodeType.sourceElement)) token
| _ ->
statement (node.append (node nodeType.sourceElement)) token
S'il vous plaît noter
Je va offrir une belle prime à la meilleure réponse, alors ne se sentent pas bousculés. Les réponses qui affichent simplement un lien auront moins de poids sur les réponses qui affichent du code ou contiennent des explications détaillées.
Note finale
Je suis vraiment nouveau à ce genre de choses alors ne pas avoir peur de me appeler un crétin.
Qu'est-ce qui ne va pas avec les arbres composés de bas en haut? –
@Ira - Vous me dites, je suis nouveau à tout cela. – ChaosPandion
Puisque deviner les connaissances antérieures est difficile, vous pouvez commenter les réponses et demander des clarifications. –