%{
openBasic_types;;
letphrase_of_cmdc=matchcwith"RUN"->Run|"LIST"->List|"END"->End|_->failwith"line : unexpected command"
;;
letop_bin_of_relr=matchrwith"="->EGAL|"<"->INF|"<="->INFEQ|">"->SUP|">="->SUPEQ|"<>"->DIFF|_->failwith"line : unexpected relation symbol"
;;%}
Les unités lexicales sont les suivantes :
Leurs noms parlent d'eux-mêmes et ils sont décrits par le fichier basic_lexer.mll (voir page ??).%token<int>Lint%token<string>Lident%token<string>Lstring%token<string>Lcmd%tokenLplusLmoinsLmultLdivLmod%token<string>Lrel%tokenLandLorLneg%tokenLparRpar%token<string>Lrem%tokenLremLletLprintLinputLifLthenLgoto%tokenLegal%tokenLeol
Les règles de priorité entre opérateurs reprennent les valeurs données par les fonctions priority_ob et priority_ou définies lorsque nous avions donnée la grammaire de notre Basic (voir page ??).
Le symbole Lopp nous servira à traiter le moins unaire. Ce n'est pas un terminal de la grammaire, mais un << pseudo non terminal >> permettant de gérer la surcharge entre opérateurs lorsque deux utilisations d'un même symbole ne doivent pas avoir la même priorité selon le contexte. Et c'est le cas du symbole moins (-). Nous reviendrons sur ce point lorsque nous aurons énoncé les règles de la grammaire.%rightLneg%leftLandLor%leftLegalLrel%leftLmod%leftLplusLmoins%leftLmultLdiv%nonassocLopp
Le non terminal axiome est line. La fonction engendrée retournera l'arbre de syntaxe abstraite de la ligne analysée.
%start line %type <Basic_types.phrase> line
Ces règles n'appellent pas de commentaire particulier sauf celle-ci :%%
line:LintinstLeol{Ligne{num=$1;inst=$2}}|LcmdLeol{phrase_of_cmd$1};
inst:Lrem{Rem$1}|LgotoLint{Goto$2}|Lprintexp{$2}|LinputLident{Input$2}|LifexpLthenLint{If($2,$4)}|LletLidentLegalexp{Let($2,$4)};
exp:Lint{ExpInt$1}|Lident{ExpVar$1}|Lstring{ExpStr$1}|Lnegexp{ExpUnr(NON,$2)}|expLplusexp{ExpBin($1,PLUS,$3)}|expLmoinsexp{ExpBin($1,MOINS,$3)}|expLmultexp{ExpBin($1,MULT,$3)}|expLdivexp{ExpBin($1,DIV,$3)}|expLmodexp{ExpBin($1,MOD,$3)}|expLegalexp{ExpBin($1,EGAL,$3)}|expLrelexp{ExpBin($1,(op_bin_of_rel$2),$3)}|expLandexp{ExpBin($1,ET,$3)}|expLorexp{ExpBin($1,OU,$3)}|Lmoinsexp%precLopp{ExpUnr(OPPOSE,$2)}|LparexpRpar{$2};%%
exp :
...
| Lmoins exp %prec Lopp { ExpUnr(OPPOSE, $2) }
Elle concerne l'utilisation unaire du symbole -.
Le mot clé %prec que l'on trouve dans cette règle indique que
cette construction doit recevoir la priorité de Lopp (ici, la
priorité maximale).Remarquons que nous avons dû isoler le symbole = qui sert à la fois dans les expressions et dans l'instruction d'affectation.
{openBasic_parser;;letstring_charss=String.subs1((String.lengths)-2);;
}
rulelexer=parse[' ''\t']{lexerlexbuf}|'\n'{Leol}|'!'{Lneg}|'&'{Land}|'|'{Lor}|'='{Legal}|'%'{Lmod}|'+'{Lplus}|'-'{Lmoins}|'*'{Lmult}|'/'{Ldiv}|['<''>']{Lrel(Lexing.lexemelexbuf)}|"<="{Lrel(Lexing.lexemelexbuf)}|">="{Lrel(Lexing.lexemelexbuf)}|"REM"[^'\n']*{Lrem(Lexing.lexemelexbuf)}|"LET"{Llet}|"PRINT"{Lprint}|"INPUT"{Linput}|"IF"{Lif}|"THEN"{Lthen}|"GOTO"{Lgoto}|"RUN"{Lcmd(Lexing.lexemelexbuf)}|"LIST"{Lcmd(Lexing.lexemelexbuf)}|"END"{Lcmd(Lexing.lexemelexbuf)}|['0'-'9']+{Lint(int_of_string(Lexing.lexemelexbuf))}|['A'-'z']+{Lident(Lexing.lexemelexbuf)}|'"'[^'"']*'"'{Lstring(string_chars(Lexing.lexemelexbuf))}
"REM" [^ '\n']*). Elle reconnaît le mot clé REM suivi par un nombre quelconque de caractères différents du retour
chariot. La seconde concerne les chaîne de caractères
('"' [^ '"']* '"') considérées comme une suite de caractères
différents de " et encadrée par des ".ocamlc -c basic_types.mli ocamlyacc basic_parser.mly ocamllex basic_lexer.mll ocamlc -c basic_parser.mli ocamlc -c basic_lexer.ml ocamlc -c basic_parser.mlCe qui engendrera les fichiers basic_lexer.cmo et basic_parser.cmo qui pourrons être intégrés à l'application.
parmatchparse(input_linestdin)with
Remarquons que nous devons remettre en fin de ligne le caractèrematchlinelexer(Lexing.from_string((input_linestdin)^"\n"))with
'\n' que la fonction input_line avait
supprimé. Ceci est nécessaire, car nous utilisons ce caractère pour
marquer la fin d'une ligne de commande (Leol).