2013-03-27 88 views
0

追赶换行我一直在调试了几天,似乎无法修复这个bug。以下代码是C语言语法的Lex文件。错误莱克斯

我有两个问题,我一直没能发现呢。

这首先是换行检测。它似乎在输出中保留了换行符,并且不会增加行var(以便跟踪行,错误反馈的列)。

我有换行符转义序列的每个组合,但似乎无法抓住它。

第二被检测一个单引号跟着一个新行,这应该产生 非法字符误差。

什么我没有看到?提前致谢!

%{ 
int col = 1; 
int line = 1; 
int aux_col = 0; 
int err = 0; 
%} 

%x C_COMMENT 

/* Identifiers */ 
ids [a-zA-Z_]([a-zA-Z0-9_])* 
/* Integers */ 
inteiros 0|[1-9]([0-9])* 

/* Chars or any Escape Sequence */ 
chrlit (\'[^\n\'\\]?\')|(\'\\.\') 
/* Strings */ 
strlit (\"[^\n\"\\]?+\")   

/* Char Error: Multi Char Constant */ 
chr_multi (\'[^\n\']{2,}\') 

/* Char Error: Non-terminated Char Constant */ 
chr_nonterm (\'[^\n\']{1,}) 

/* String Error: Non-terminated String Constant */ 
strerr (\"[^\n\"]?+) 



%% 

"/*" {BEGIN(C_COMMENT); if(col==0) {aux_col=3;} else {aux_col=2;}} 
<C_COMMENT>"*/" {col+=aux_col+2; aux_col=0; BEGIN(INITIAL);} 
<C_COMMENT><<EOF>> {printf("Line %d, col %d: unterminated comment\n",line, col); BEGIN(INITIAL);} 
<C_COMMENT>. {aux_col++;} 


"do"|"struct"|"auto"|"long"|"switch"|"break"|"enum"|"register"|"typedef" 
"case"|"extern"|"union"|"float"|"short"|"unsigned"|"const"|"for"|"signed"  "void"|"continue"|"goto"|"sizeof"|"volatile"|"default"|"static" 
{col+=yyleng; printf("RESERVED\n");} 

return {col+=yyleng; printf("RETURN\n");} 

while {col+=yyleng; printf("WHILE\n");} 

printf {col+=yyleng; printf("PRINTF\n");} 

atoi {col+=yyleng; printf("ATOI\n");} 

if {col+=yyleng; printf("IF\n");} 

int {col+=yyleng; printf("INT\n");} 

itoa {col+=yyleng; printf("ITOA\n");} 

char {col+=yyleng; printf("CHAR\n");} 

"&&" {col+=yyleng; printf("AND\n");} 

"&" {col+=yyleng; printf("AMP\n");} 

"=" {col+=yyleng; printf("ASSIGN\n");} 

"*" {col+=yyleng; printf("AST\n");} 

"," {col+=yyleng; printf("COMMA\n");} 

"/" {col+=yyleng; printf("DIV\n");} 

"==" {col+=yyleng; printf("EQ\n");} 

">=" {col+=yyleng; printf("GE\n");} 

">" {col+=yyleng; printf("GT\n");} 

"{" {col+=yyleng; printf("LBRACE\n");} 

"<=" {col+=yyleng; printf("LE\n");} 

"(" {col+=yyleng; printf("LPAR\n");} 

"[" {col+=yyleng; printf("LSQ\n");} 

"<" {col+=yyleng; printf("LT\n");} 

"-" {col+=yyleng; printf("MINUS\n");} 

"%" {col+=yyleng; printf("MOD\n");} 

"!=" {col+=yyleng; printf("NE\n");} 

"!" {col+=yyleng; printf("NOT\n");} 

"+" {col+=yyleng; printf("PLUS\n");} 

"}" {col+=yyleng; printf("RBRACE\n");} 

")" {col+=yyleng; printf("RPAR\n");} 

"]" {col+=yyleng; printf("RSQ\n");} 

";" {col+=yyleng; printf("SEMI\n");} 

\|\| {col+=yyleng; printf("OR\n");} 



{ids} {col+=yyleng; printf("ID(%s)\n",yytext);} 
{inteiros} {col+=yyleng; printf("INTLIT(%s)\n", yytext);} 
{strlit} {col+=yyleng; printf("STRLIT(%s)\n", yytext);} 
{chrlit} {col+=yyleng; printf("CHRLIT(%s)\n", yytext);} 


{chr_multi} {if(col==0) {col++;err=1;} 
      printf("Line %d, col %d: multi-character char constant\n", line, col); 
      col+=yyleng; 
      if(err == 1) {col--;err=0;}} 

{chr_nonterm} {if(col==0) {col++;err=1;} 
      printf("Line %d, col %d: unterminated char constant\n", line, col); 
      col+=yyleng;if(err == 1) {col--;err=0;}} 

{strerr} {if(col==0) {col++;err=1;} 
      printf("Line %d, col %d: unterminated string constant\n", line,col); 
      col+=yyleng; 
      if(err == 1) {col--;err=0;}} 

" " {col++;}; 
'\n' {col=1;line++;printf("BAR N\n");} 
"\\n" {col=1;line++;printf("BAR N2\n");} 
\n {col=1;line++;printf("BAR N3\n");} 

.|\' {printf("Line %d, col %d: illegal character ('%s')\n", line, col, yytext); col++;} 

%% 

int main() { 
    yylex(); 
    return 0; 
} 

int yywrap(){ 
    return 1; 
} 
+0

谢谢你的时间! 我将一个文件传送到程序中。例如,只有一个关键字后跟两个输入。 if 2013-04-02 17:35:57

+0

PS。是的,我通过添加|修复了这个错误并加入三条线。另外,我修复了COMMENT状态以捕获\ n。谢谢! – 2013-04-02 17:37:37

回答

1

您在评论中没有匹配换行符。 .匹配任何字符,但换行符。

固定的规则匹配的关键字(添加一对夫妇的|并把它全部在一行上)报告单引号后跟一个换行符非法字符程序后。所以,请给出确实的输入,给出意想不到的结果。

来自Bryan同事的问候。