Next: , Previous: Example-Counting Words, Up: More Examples   [Contents][Index]


7.2 Pascal¤Î¥µ¥Ö¥»¥Ã¥ÈÍѤλú¶ç¥¹¥­¥ã¥Ê

¤³¤³¤Ç¤Ï¡¢ Pascal¤Î¤è¤¦¤Ê¸À¸ìÍѤλú¶ç¥¹¥­¥ã¥Ê¤òºî¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ¤³¤Î¥¹¥­¥ã¥ÊÄêµÁ¤Ç¤Ï¡¢ ¸Ä¡¹¤Î¥­¡¼¥ï¡¼¥É¤¬¥ë¡¼¥ë¤È¤·¤Æ¥ê¥¹¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ¡Ê°ìÈÌŪ¤Ë¤Ï¡¢ ¤¹¤Ù¤Æ¤Î¥­¡¼¥ï¡¼¥É¤ò¥Æ¡¼¥Ö¥ë¤Ë³ÊǼ¤·¤Æ¤«¤é¥Æ¡¼¥Ö¥ë¸¡º÷¤ò»È¤¦¼êË¡¤¬¤è¤¯¸«¤é¤ì¤Þ¤¹¤¬¡¢¡Ë ¤³¤³¤Ç¤ÎÊýË¡¤Ï¡¢ ¥­¡¼¥ï¡¼¥É¤È¼±Ê̻ҤȤò¶èÊ̤¹¤ë¤¿¤á¤ÎÊýË¡¤È¤·¤Æ¤Ï¡¢ °ìÈÌŪ¤ËºÇ¤â´Êñ¤Ê¤â¤Î¤Ç¤¹¡£ ¤Þ¤¿¡¢ ¼±ÊÌ»ÒÍѤˤ¿¤À£±¤Ä¤Î¥ë¡¼¥ë¤¬¤¢¤ë¤È¤¤¤¦ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¿¤¯¤Î¾ì¹ç¡¢ ¤³¤Î¥ë¡¼¥ë¤Ï¥·¥ó¥Ü¥ë¡¦¥Æ¡¼¥Ö¥ë¤ò´ÉÍý¤¹¤ë¤¿¤á¤Î¥µ¥Ö¥ë¡¼¥Á¥ó¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£

¤â¤¦£±¤ÄÃí°Õ¤¹¤Ù¤­ÅÀ¤Ï¡¢ ‘_FILE’¤È‘_BEGIN’¤¬ÀèÆ¬¤Ë¥¢¥ó¥À¡¼¥¹¥³¥¢¤ò»ý¤Ä¤È¤¤¤¦ÅÀ¤Ç¤¹¡£ Flex¡¢ ¤Þ¤¿¤ÏC¤ÇÄêµÁºÑ¤ß¤Î̾Á°¤Ï¡¢ ÄɲÃŪ¤Ê¹©Éפʤ·¤Ç¤Ï»È¤¨¤Ê¤¤¤È¤¤¤¦¤³¤È¤ò¼¨¤¹¤¿¤á¤Ë¡¢ ¤³¤Î¤è¤¦¤Ë¤·¤Æ¤¢¤ê¤Þ¤¹¡£ ¤³¤ì¤è¤ê¤â¤â¤Ã¤È°ìÈÌŪ¤Ë»È¤ï¤ì¤ë¼êË¡¤Ï¡¢ ¤¹¤Ù¤Æ¤Î¥È¡¼¥¯¥ó¤ÎÀèÆ¬¤â¤·¤¯¤ÏËöÈø¤Ë²¿¤é¤«¤Îʸ»úÎó¤òÉղ乤ë¤È¤¤¤¦¤â¤Î¤Ç¡¢ ¤³¤¦¤¹¤ë¤³¤È¤Ë¤è¤Ã¤ÆÌäÂê¤ÏȯÀ¸¤·¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ ‘TOK’¤ä‘SYM’¤¬°ìÈÌŪ¤Ë¤è¤¯»È¤ï¤ì¤ë³ÈÄ¥»Ò¤Ç¤¹¡£

/*
 * pascal.lex : PASCAL¥¹¥­¥ã¥Ê¤ÎÎã
 */

%{
#include <stdio.h>
#include "y.tab.h"

int line_number = 0;

void yyerror(char *message);

%}

%x COMMENT1 COMMENT2

white_space       [ \t]*
digit             [0-9]
alpha             [A-Za-z_]
alpha_num         ({alpha}|{digit})
hex_digit         [0-9A-F]
identifier        {alpha}{alpha_num}*
unsigned_integer  {digit}+
hex_integer       ${hex_digit}{hex_digit}*
exponent          e[+-]?{digit}+
i                 {unsigned_integer}
real              ({i}\.{i}?|{i}?\.{i}){exponent}?
string            \'([^'\n]|\'\')+\'
bad_string        \'([^'\n]|\'\')+

%%
"{"                  BEGIN(COMMENT1);
<COMMENT1>[^}\n]+
<COMMENT1>\n            ++line_number;
<COMMENT1><<EOF>>    yyerror("EOF in comment");
<COMMENT1>"}"        BEGIN(INITIAL);

"(*"                 BEGIN(COMMENT2);
<COMMENT2>[^)*\n]+
<COMMENT2>\n            ++line_number;
<COMMENT2><<EOF>>    yyerror("EOF in comment");
<COMMENT2>"*)"       BEGIN(INITIAL);
<COMMENT2>[*)]

/* FILE¤ÈBEGIN¤Ï¡¢Flex¤äC¤Ë¤ª¤¤¤Æ¤Ï´û¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤¿¤á
 * »È¤¦¤³¤È¤¬¤Ç¤­¤Ê¤¤ÅÀ¤ËÃí°Õ¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤Î¥È¡¼¥¯¥ó¤Î
 * ÀèÆ¬¤ËTOK_¤ä¤½¤Î¾¤ÎÀÜÆ¬¼­¤òÉղ乤뤳¤È¤Ë¤è¤Ã¤Æ¡¢¤è¤ê
 * ¤¹¤Ã¤­¤ê¤È¹îÉþ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë
 */
and                  return(AND);
array                return(ARRAY);
begin                return(_BEGIN);
case                 return(CASE);
const                return(CONST);
div                  return(DIV);
do                   return(DO);
downto               return(DOWNTO);
else                 return(ELSE);
end                  return(END);
file                 return(_FILE);
for                  return(FOR);
function             return(FUNCTION);
goto                 return(GOTO);
if                   return(IF);
in                   return(IN);
label                return(LABEL);
mod                  return(MOD);
nil                  return(NIL);
not                  return(NOT);
of                   return(OF);
packed               return(PACKED);
procedure            return(PROCEDURE);
program              return(PROGRAM);
record               return(RECORD);
repeat               return(REPEAT);
set                  return(SET);
then                 return(THEN);
to                   return(TO);
type                 return(TYPE);
until                return(UNTIL);
var                  return(VAR);
while                return(WHILE);
with                 return(WITH);

"<="|"=<"            return(LEQ);
"=>"|">="            return(GEQ);
"<>"                 return(NEQ);
"="                  return(EQ);

".."                 return(DOUBLEDOT);

{unsigned_integer}   return(UNSIGNED_INTEGER);
{real}               return(REAL);
{hex_integer}        return(HEX_INTEGER);
{string}             return{STRING};
{bad_string}         yyerror("Unterminated string");

{identifier}         return(IDENTIFIER);

[*/+\-,^.;:()\[\]]   return(yytext[0]);

{white_space}        /* ²¿¤â¤·¤Ê¤¤ */
\n                   line_number += 1;
.                    yyerror("Illegal input");

%%
void yyerror(char *message)
{
   fprintf(stderr,"Error: \"%s\" in line %d.  Token = %s\n",
           message,line_number,yytext);
   exit(1);
}