jjzjj

c++ - 使用来自 Boost.Spirit 的 Lex 和 Qi 在语法规则中使用词法分析器标记属性

让我们考虑以下代码:#include#include#include#include#include#include#include#includenamespacelex=boost::spirit::lex;namespaceqi=boost::spirit::qi;namespacephoenix=boost::phoenix;structoperation{enumtype{add,sub,mul,div};};templateclassexpression_lexer:publiclex::lexer{public:typedeflex::token_defoperator_

Lex 生成一个词法分析器

 lex通过输入一个.l文件生成一个lex.yy.c文件,然后通过c编译器编译成一个可执行的词法分析器。该词法分析器扫描输入源文件,生成一个token符号流给后面语法分析器使用。 .l文件的结构,分成三个部分,声明,转换规则,自定义规则。三个部分由%%分割declarations%%translationrules%%auxiliaryprocedures声明段,包含希望出现出现再目标c文件种的代码,正则表达式的声明。符号常量的声明。%{%}包裹内容#include#include"y.tab.h"typedefchar*YYSTYPE;//符号常量声明char*yylval;/* regul

c++ - 如何将 boost::spirit::lex token 的值从 iterator_range 转换为字符串?

当我尝试从iterator_range转换标记的值时,词法分析器在尝试读取下一个标记时失败。这是包含token定义的token结构:(我不认为这是相关的,但我包括以防万一。)templatestructTokens:boost::spirit::lex::lexer{Tokens();boost::spirit::lex::token_defidentifier;boost::spirit::lex::token_defstring;boost::spirit::lex::token_defboolean;boost::spirit::lex::token_defreal;boost:

c++ - 在 Windows、Visual C++ 2008 上安装 LEX/YACC 或 flex/bison

网上字节太多,资料太少,所以我决定问问有没有人已经做过这样的安装。如何编译/在哪里下载二进制文件?我在哪里可以找到构建规则?我在哪里可以找到一堆好的样本(具有结合性分辨率、符号表等)? 最佳答案 您应该能够将flex和bison作为cygwin的一部分,然后在visualstudio中引用它们。这有更多细节:http://blogs.msdn.com/aaronmar/archive/2004/10/13/242004.aspx 关于c++-在Windows、VisualC++2008上

c++ - boost::spirit::lex 和空格的问题

我尝试学习使用boost::spirit。为此,我想创建一些简单的词法分析器,将它们组合起来,然后开始使用spirit进行解析。我尝试修改示例,但它没有按预期运行(结果r不正确)。这是词法分析器:#includenamespacelex=boost::spirit::lex;templatestructlexer_identifier:lex::lexer{lexer_identifier():identifier("[a-zA-Z_][a-zA-Z0-9_]*"),white_space("[\\t\\n]+"){usingboost::spirit::lex::_start;usi

c++ - 开发类似python的小型语言时的缩进控制

我正在使用flex、byacc(用于词法和解析)和C++开发一种类似Python的小型语言,但我有几个关于范围控制的问题。就像python它使用空格(或制表符)进行缩进一样,不仅如此,我还想实现索引中断,例如,如果您在另一个while循环内的while循环中键入“break2”,它不仅会从最后一个循环中断,但也从第一个循环中断(因此中断后的数字2)等等。例子:while1while1break2'helloworld'!!#willneverreachthis."!!"outputswithanewlineend'helloworldagain'!!#alsowillneverreac

c++ - 没有动态内存分配的 Lex 和 Yacc

我正在设计在禁止使用动态内存的嵌入式环境中运行的软件。Lex和Yacc非常适合该应用程序。我可以将Lex和Yacc配置为完全不使用动态内存分配吗?我能否将Lex和Yacc配置为使用预定义的内存块,从而将动态内存的使用限制在该预定义的空间内?我能否将动态内存的使用限制为仅用于程序初始化(即程序首次运行时)?编辑:作为对TonyK的回应,我希望解析器不要使用动态内存。谢谢 最佳答案 当然可以,如果您可以自己编译Lex和Yacc。你只需要实现你自己的malloc和free,并链接到它们。(假设Lex和Yacc是纯C,我认为是这样。)编辑我

c++ - 如何使用 boost::spirit::lex 实现包含指令?

我有一个从spirit::lex和spirit::qi构建的简单配置文件解析器。当词法分析器到达模式include"path"时,我希望包含文件的文本。你可能知道,spirit::lexer::begin()启动扫描过程://Readfilecontentsintoastd::string...//_firstand_lastareconstchar*_first=_contents.c_str();_last=&_first[_input.size()];//_tokenisalexer::iterator_typeforthecurrenttoken_token=_lexer.be

c++ - 如何在不先将整个文件读入内存的情况下使用 Boost::Spirit::Lex 对文件进行 lex?

我正在研究使用boost::spirit::lex编写词法分析器,但我能找到的所有示例似乎都假定您已先将整个文件读入RAM。我想编写一个不需要整个字符串都在RAM中的词法分析器,这可能吗?或者我需要使用其他东西吗?我尝试使用istream_iterator,但除非我使用constchar*作为迭代器类型,否则boost会给我一个编译错误。例如我能找到的所有示例基本上都是这样做的:lex_functor_type>lex_functor;//assumesentirefileisinmemorycharconst*first=str.c_str();charconst*last=&fir

c++ - Boost Spirit 和 Lex 解析器问题

我一直在努力尝试(逐步)修改文档中的示例代码,但没有太大的不同,我没有得到我期望的行为。具体来说,“if”语句在(我的意图是)它应该通过时失败(有一个“else”但解析器的那部分在调试期间被删除)。赋值语句工作正常。我也有一个“while”语句,它与“if”语句有同样的问题,所以我确信如果我能得到帮助来弄清楚为什么一个不工作,那么让另一个继续工作应该很容易。它一定有点微妙,因为这几乎是其中一个示例中的逐字记录。#include#include#include#defineBOOST_SPIRIT_DEBUG#include#include#include#include#include