首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

flex词法分析状态使用有关问题

2012-11-08 
flex词法分析状态使用问题%{#include string.h#include util.h#include tokens.h#include errormsg

flex词法分析状态使用问题
%{
#include <string.h>
#include "util.h"
#include "tokens.h"
#include "errormsg.h"

int charPos=1;

int yywrap(void)
{
  charPos=1;
  return 1;
}

void adjust(void)
{
  EM_tokPos=charPos;
  charPos+=yyleng;
}
%}
delim [ \t]
whitespace {delim}+
TraditionalComment ("/*"[^*]+"*/" | "/*""*"+"/")
LineTerminator ("\n"|"\r"|"\r\n"|"\n\r")
Comment "/*"([^\*]|(\*)*[^\*/])*(\*)*"*/"
DecIntergerLiteral ([0-9]+)
RealNum ([0-9]+"."[0-9]*) | ([0-9]*"."[0-9]+)
Identifier ([a-zA-Z_][a-zA-Z_0-9]*)
%s INITIAL1 
%s STRING1
%%
<INITIAL1>{whitespace} {}
<INITIAL1>{Comment} {}
<INITIAL1>\" {adjust(); BEGIN(STRING1);}
<INITIAL1>"while" {adjust(); return WHILE;}
<INITIAL1>"for" {adjust(); return FOR;}
<INITIAL1>"to" {adjust(); return TO;}
<INITIAL1>"break" {adjust(); return BREAK;}
<INITIAL1>"let" {adjust(); return LET;}
<INITIAL1>"in" {adjust(); return IN;}
<INITIAL1>"end" {adjust(); return END;}
<INITIAL1>"function" {adjust(); return FUNCTION;}
<INITIAL1>"var" {adjust(); return VAR;}
<INITIAL1>"type" {adjust(); return TYPE;}
<INITIAL1>"array" {adjust(); return ARRAY;}
<INITIAL1>"if" {adjust(); return IF;}
<INITIAL1>"then" {adjust(); return THEN;}
<INITIAL1>"else" {adjust(); return ELSE;}
<INITIAL1>"do" {adjust(); return DO;}
<INITIAL1>"of" {adjust(); return OF;}
<INITIAL1>"nil" {adjust(); return NIL;}
<INITIAL1>"," {adjust(); return COMMA;}
<INITIAL1>":" {adjust(); return COLON;}
<INITIAL1>";" {adjust(); return SEMICOLON;}
<INITIAL1>"(" {adjust(); return LBRACK;}
<INITIAL1>")" {adjust(); return RBRACK;}
<INITIAL1>"[" {adjust(); return LPAREN;}
<INITIAL1>"]" {adjust(); return RPAREN;}
<INITIAL1>"{" {adjust(); return LBRACE;}
<INITIAL1>"}" {adjust(); return RBRACE;}
<INITIAL1>"." {adjust(); return DOT;}
<INITIAL1>"+" {adjust(); return PLUS;}
<INITIAL1>"-" {adjust(); return MINUS;}
<INITIAL1>"*" {adjust(); return TIMES;}
<INITIAL1>"/" {adjust(); return DIVIDE;}
<INITIAL1>"=" {adjust(); return EQ;}
<INITIAL1>"<>" {adjust(); return NEQ;}
<INITIAL1>"<" {adjust(); return LT;}
<INITIAL1>"<=" {adjust(); return LE;}
<INITIAL1>">" {adjust(); return GT;}
<INITIAL1>">=" {adjust(); return GE;}
<INITIAL1>"&" {adjust(); return AND;}
<INITIAL1>"|" {adjust(); return OR;}
<INITIAL1>":=" {adjust(); return ASSIGN;}
<INITIAL1>{DecIntergerLiteral} {adjust(); yylval.ival=atoi(yytext); return INT;}
<INITIAL1>{Identifier} {adjust(); yylval.sval = String(yytext); return ID;}
<INITIAL1>{LineTerminator} {adjust(); EM_newline(); continue;}

<STRING1>\" {BEGIN(INITIAL1);adjust();yylval.sval = String(yytext);return STRING;}
<STRING1>[^\n\t\"\\]+ {yymore();}
<STRING1>\\t {yymore();}
<STRING1>\\n {yymore();}
<STRING1>\\\" {yymore();}
<STRING1>\\\\ {yymore();}

这个FLEX程序有什么错误啊


state用的不对吗

widon@widon-laptop:~/Desktop/tiger/chap2$ ./lextest test1.tig 
/* an array type and an array variable */
let
type arrtype = array of int
var arr1:arrtype := arrtype [10] of 0
in
arr1
  print("hello world\n");
end

/* an array type and an array variable */

感觉没有对源程序做处理啊。。
去掉状态前缀就好了,可是我需要使用状态啊。


[解决办法]
书上的代码跑不过去???

先写个简单的测试吧
[解决办法]
没太懂,scanner执行完应该是出来parse需要的东西吧?

热点排行