This is an old revision of the document!
Le jison se compose de deux parties: une partie de description de jetons (tokens)(fichier.l) et une partie de description de grammaire (fichier.y).
Ws \s+ Digit [0-9] %% "-" { return '-'; } "+" { return '+'; } {Ws} { /* empty space */ } {Digit}+ { return 'NUMBER'; }
// when it is ambiguous, derive the left part %left '+' '-' %{ // javascript code // use this to declare global // javascript code that your parser uses %} %% start: expr { return $$; }; expr: expr '+' expr { console.log ('rule expr + expr'); console.log ($1 + ' + ' + $3); } | expr '-' expr { console.log ('rule expr - expr'); console.log ($1 + ' - ' + $3); } | NUMBER { console.log ('rule NUMBER'); console.log ('number '+$1); $$ = $1; };
La forme d'une règle de grammaire est
rule: alternative1 { action statements } | alternative2 { action statements } | alternative3 { action statements } ... | alternativen { action statements };
Ici vous pouvez écrire du code JavaScript.
Les caractères spéciaux sont
La règle de début renvoie généralement une valeur.
Si le parser ne comprend pas un jeton ou une règle, il lancera une exception.
L'exception a le format suivant
Pour générer le parser, exécutez jison en utilisant les fichiers .l et .y
jison example.y example.l
Cela générera un fichier JavaScript que vous pouvez utiliser pour diviser un texte en jetons et le parser en utilisant les jetons et la grammaire décrits dans le fichier jison.
Pour utiliser le parser généré, importez le fichier de parser et utilisez l'objet parser. Cet objet a une fonction parse qui reçoit un string et le parse. Au moment de l'analyse, il exécute les actions définies dans le fichier jison et retourne la valeur renvoyée par l'action de règle de démarrage.
"use strict"; // import the generated Parser var parser = require ('./example.js').parser; // add a text to the parser try { // run the parser using a string parser.parse ('22+3-4+6'); } catch (e) { // display the error message and data console.log (e.message); console.log (e.hash); }
L'arbre d'analyse doit être généré manuellement. Cela signifie qu'au lieu de définir une valeur sur $$, nous définissons un objet qui est en fait un nœud dans l'arbre de parse.
... start: expr { return { type: 'start', // type of node items: [$$] // array of children - here just one } }; expr: expr '+' expr { $$ = { type: 'expr', // type of node items: [$1, $2, $3] // array of children - here just one } }; ...
int a <- 2; double b <- 5.5; string c <- "alf";
2 + 3 * 5
, le programme doit afficher la valeur 17 apres l'analyse de la grammaire. (1.5p) (2 + 3) * 5
votre programme doit afficher la valeur 25.(1p)2 + 3 * 5; /* Operator: * Operands: 3, 5 15 Operator: + Operands: 2, 15 17 */
int a <- 2 + 3 * 5;