我需要将标记设置为“除新行开头之外的任何字符”。我试试
[^^]
但这行不通。首先,我需要检测一些图案线:
%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 流中的 2 个字符串)一定是错误的,但模式可以识别它。我需要识别一条输入线上的所有开始条件。我该怎么做?
最佳答案
你做错了。这是语法问题,不是词汇问题。如果换行符在您的语言中很重要,它应该明确出现在语法中,并由词法分析器作为标记返回。
关于c++ - 仅在一个字符串 lex 处识别开始条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22618228/