仅在一个字符串lex处识别开始条件

时间:2014-03-24 18:58:05

标签: c++ compiler-construction lex

我需要设置像#34;任何字符的标记,除了新行的开头"。我试试

[^^]

但这不起作用。首先,我需要检测一些模式行:

%s arithm secOper
NUMBER  [0-9]+
INTEGER (-?[0-9]+)
ASSIGN [=]
VARY    [A-Za-z][?-i:a-z0-9]{0,15}
ARITHMSIGNS (\+[ ]*|\-[ ]*|\*[ ]*|\/[ ]*)
SPACE   [ ]+
SPACES  [ ]*
ANY [^^]

%%

^{NUMBER}{SPACES}{VARY}{SPACES}{ASSIGN}{SPACES}({VARY}|{INTEGER})   {BEGIN(arithm);}
<arithm>{ANY}{SPACES}{ARITHMSIGNS}/({VARY}|{INTEGER})    {BEGIN(secOper);}
<secOper>{VARY}|{INTEGER}$    {BEGIN(INITIAL);}

%%

如此字符串

54  firstVar = 43  * newVar

确实如此,但如果输入是:

54  firstVar  =  43
 * newVar

(带有\ n的c-like流中的2个字符串)必须是错误的,但模式会识别它。我需要在一条输入线上识别所有启动条件。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

你这样做是错误的。这是语法问题,而不是词汇问题。如果新行在您的语言中很重要,它应该在语法中明确显示,并由词法分析器作为标记返回。