我正在设计一个接受简单c代码的lex,我想在其中放置一个接受多个分号的规则。我试过(; {2,}}& (;; +)但它不接受。
声明lex将继续工作
int i=1;
i=3*2;;;;
我想添加正则表达式以允许两个语句。因为C验证;;;;。
答案 0 :(得分:0)
我无法重现OP。这就是我试过的:
档案test-semicolon.l
:
%{
#include <stdio.h>
%}
%option noyywrap
%%
;{2,} printf("HERE->%s", yytext);
. ECHO;
%%
int main(int argc, char **argv) { yylex(); return 0; }
在cygwin上使用flex和gcc进行编译和测试:
$ flex -V
flex 2.6.3
$ flex -otest-semicolon.c test-semicolon.l ; gcc -o test-semicolon test-semicolon.c
test-semicolon.c:398:0: warning: "yywrap" redefined
^
test-semicolon.c:74:0: note: this is the location of the previous definition
^
$ echo '
> 123
> 123;
> 123;;
> 123;;;
> 123;;;;
> int i=1;
> i=3*2;;;;
> ' | ./test-semicolon
123
123;
123HERE->;;
123HERE->;;;
123HERE->;;;;
int i=1;
i=3*2HERE->;;;;
$
输出显示两个或更多;
的任何序列都按预期匹配。
顺便说一下,C的lex和yacc来源位于ANSI C grammar, Lex specification和ANSI C Yacc grammar。
另外,我可以推荐这本书:A Retargetable C Compiler: Design and Implementation。