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

标签 c++ compiler-construction lex

我需要将标记设置为“除新行开头之外的任何字符”。我试试

[^^]

但这行不通。首先,我需要检测一些图案线:

%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/

相关文章:

compiler-construction - 如何在 Eclipse 和 Windows 中指向我的编译器和链接器?

c++ - 创建 C/C++ 解析器/分析器的好工具

c - 用于识别 C 中变量声明的正则表达式

char总是使用flex改变

c++ - 是否有可以在 Win32 和 MacOSX 系统上使用的跨平台 unicode 字符串类?

c++ - 如何正确增加用 cv::findContours 找到的矩形的大小

c++ - 使用 static_cast<void>() 的目的是什么?

c++ - 作为成员变量的 lambda 函数崩溃

c# - 'CompanyName.Foo' 是一个 'namespace' 但像 'type' 一样使用

c# - 如何使用 CSharpCodeProvider 类运行 C# 4.0 编译器?