如何验证int i ;;;在lex?

时间:2017-02-28 16:36:09

标签: regex lex

我正在设计一个接受简单c代码的lex,我想在其中放置一个接受多个分号的规则。我试过(; {2,}}& (;; +)但它不接受。

声明lex将继续工作

int i=1;
i=3*2;;;;

我想添加正则表达式以允许两个语句。因为C验证;;;;。

1 个答案:

答案 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 specificationANSI C Yacc grammar

另外,我可以推荐这本书:A Retargetable C Compiler: Design and Implementation