SuivantPrec.Bas prec.BasNiv. sup.

Chapitre 4 L'analyseur 

ASET utilise Lex et Yacc pour Turbo Pascal (Version 2.0 par Albert Graef) pour parcourir et analyser l'entrée.

Il est difficile de décrire les détails de l'analyseur en d'autres termes que lex et yacc: -). Par conséquent j'inclus ici les spécifications, pour toute personne qui s'intéresserait aux détails.

 special         [-+*/%(),!<>=^']
 
 str0            [^-+*/%(),!<>=^' \t\n]+
 str1            '[^'\n]*'
 
 %%
 
 ^#.*            ;
 
 ":="            return(T_ASSIGN);
 "**"            return(ord('^'));
 "div"           return(ord(T_DIV));
 "mod"           return(ord('%'));
 "and"           return(T_AND);
 "or"            return(T_OR);
 "nand"          return(T_NAND);
 "nor"           return(T_NOR);
 "xor"           return(T_XOR);
 "not"           return(T_NOT);
 
 "!="            return(T_NE);
 "=="            return(ord('='));
 "ne"            return(T_NE);
 "eq"            return(ord('='));
 "lt"            return(ord('<'));
 "gt"            return(ord('>'));
 "le"            return(T_LE);
 "ge"            return(T_GE);
 
 ^{str0}         begin
                  { the first value will never be treated as a function,
                    because it is always the target of an assignment }
                    Passign(yylval.strg,yytext);
                    return(T_VALUE)
                 end;
 
 {str0}          begin
                   if (lookup(yytext,yylval.func)) then
                     return(T_FUNCTION)
                   else begin
                     Passign(yylval.strg,yytext);
                     return(T_VALUE)
                   end
                 end;
 
 {str1}          begin
                   Passign(yylval.strg,copy(yytext,2,yyleng-2));
                   return(T_VALUE)
                 end;
 
 [ \t]+          ;
 {special}       return(ord(yytext[1]));
 \n              return(ord(yytext[1]));
 
 %%
 ---------------------------------------------------------------------------
 %union {
   case boolean of
     false: (func: integer);
     true:  (strg: Pstrg);
   }
 
 %token <strg> T_VALUE
 %type  <strg> expr
 %type  <strg> optexpr
 %token <func> T_FUNCTION
 %token T_ASSIGN
 %left  T_AND T_OR T_NAND T_NOR T_XOR
 %left  '=' T_NE '<' T_LE '>' T_GE
 %left  '+' '-'
 %left  '^' '*' '/' '%' T_DIV
 %right T_UMINUS T_UNOT
 %token T_NOT
 
 %%
 
 input   : /* empty */
         | T_VALUE assop expr
         | T_VALUE assop
         | T_VALUE
         | error
         ;
 
 assop   : T_ASSIGN
         | '='
         ;
 expr    : expr '+' expr
         | expr '-' expr
         | expr '*' expr
         | expr '/' expr
         | expr '%' expr
         | expr '^' expr
         | expr T_DIV expr
         | expr '=' expr
         | expr '<' expr
         | expr '>' expr
         | expr T_NE expr
         | expr T_LE expr
         | expr T_GE expr
         | expr T_AND expr
         | expr T_OR expr
         | expr T_NAND expr
         | expr T_NOR expr
         | expr T_XOR expr
         | '(' expr ')'
         | T_NOT expr %prec T_UNOT
         | '-' expr %prec T_UMINUS
         | T_VALUE
         | T_VALUE T_VALUE
         | T_FUNCTION optpars
         ;
 
 optpars : /* empty */
         | '(' parlist ')'
         ;
 parlist : optexpr
         | parlist "," optexpr
         ;
 
 optexpr : /* empty */
         | expr
         ;
 
 %%
 ---------------------------------------------------------------------------
SuivantPrec.Bas prec.HautNiv. sup.