Next: Example-Jargon Converter, Previous: Example-Counting Words, Up: More Examples [Contents][Index]
¤³¤³¤Ç¤Ï¡¢ 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);
}