LEX:读取特定语法错误的代码

时间:2016-03-15 05:41:06

标签: compilation yacc lex scanning

对lex来说很新。这是针对Prog的项目。 LANGS。类

考虑使用以下语法构建的语言:

<program> ::= <statement> | <program> <statement>
<statement> ::= <assignStmt> | <ifStmt> | <whileStmt> | <printStmt>
<assignStmt> ::= <id> = <expr> ;
<ifStmt> ::= if ( <expr> ) then <stmt>
<whileStmt> ::= while ( <expr> ) do <stmt>
<printStmt> ::= print <expr> ;
<expr> ::= <term> | <expr> <addOp> <term>
<term> ::= <factor> | <term> <multOp> <factor>
<factor> ::= <id> | <number> | - <factor> | ( <expr> )
<id> ::= <letter> | <id> <letter>
<letter> ::= a | b | c | d | e | f | g | h | i | j
| k | l | m | n | o | p | r | s | t
| u | v | w | x | y | z
<number> ::= <digit> | <number> <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<addOp> ::= + | -
<multOp> ::= * | / | %

实现基于lex的C程序,该程序扫描语言的所有标记(关键字,标识符,数字,运算符等)。

我的问题是我得到了&#34; l7t2.l:32:无法识别的规则&#34;错误。我认为这源于&#34; word&#34;以上但不确定如何解决它。

继承我的lex文件,l7t2.l

%option noyywrap

%{
#include "l7t2.h"
int totDol = 0;
int *outword;
%}

digit [0-9]
number {digit}*

letter  [a-zA-Z]
word    ({letter}{[a-zA-Z0-9]}+)

%%

"if" {return IF;}
"then" {return THEN;}
"while" {return WHILE;}
"do" {return DO;}
"+" {return PLUSOP;}
"-" {return MINUSOP;}
"*" {return MULTOP;}
"/" {return DIVOP;}
"%" {return MODOP;}
";" {return SEMICOLON;}
"=" {return EQUAL;}
"print" {return PRINT;}

[ \t\n]+        ;

{word} {strcpy(outword, yytext);}

\${number}  {totDol = 0; totDol += strtod(yytext+1, NULL); return totDol;}

%%

1 个答案:

答案 0 :(得分:1)

word    ({letter}{[a-zA-Z0-9]}+)

问题出在这里。 {}仅用于介绍先前的定义。它应该是:

word    ({letter}[a-zA-Z0-9]+)

在第32行,你肯定应该从该规则返回一个值吗?

注意:您可以删除所有单一特殊字符规则,并拥有最终的覆盖所有规则:

. return yytext[0];

这也意味着您可以直接在语法中使用特殊字符,例如'+'代替PLUSOP。它还使你不必在词法分析器中处理非法字符:解析器就可以了。