可以说我有这样的代码(行号作为参考):
1:
2:function FuncName_1 {
3: var Var_1 = 3;
4: var Var_2 = 4;
5: ...
Run Code Online (Sandbox Code Playgroud)
我想编写一个语法来解析这样的文本,将所有的标识符(函数和变量名)信息放入一个树(utree?).每个节点应保留:line_num,column_num和符号值.例:
root: FuncName_1 (line:2,col:10)
children[0]: Var_1 (line:3, col:8)
children[1]: Var_1 (line:4, col:9)
Run Code Online (Sandbox Code Playgroud)
我想将它放入树中,因为我计划遍历该树,并且对于每个节点,我必须知道"上下文":(当前节点的所有父节点).
例如,在使用Var_1处理节点时,我必须知道这是函数FuncName_1的局部变量的名称(当前正在作为节点处理,但是前一级)
我无法弄清楚一些事情
我是Boost的新手,所以我一遍又一遍地阅读Spirit文章,我试着谷歌我的问题,但我不知道怎么能把所有的部分放在一起找到解决方案.好像没有人像我之前那样有这样的用例(或者我只是无法找到它)看起来像位置迭代器的唯一解决方案是解析错误处理的那些,但事实并非如此我感兴趣的.只解析我正在采取的代码的代码如下,但我不知道如何继续前进.
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_line_pos_iterator.hpp>
namespace qi = boost::spirit::qi;
typedef boost::spirit::line_pos_iterator<std::string::const_iterator> pos_iterator_t;
template<typename Iterator=pos_iterator_t, typename Skipper=qi::space_type>
struct ParseGrammar: public qi::grammar<Iterator, Skipper>
{
ParseGrammar():ParseGrammar::base_type(SourceCode)
{
using namespace qi;
KeywordFunction = lit("function");
KeywordVar = lit("var");
SemiColon = lit(';');
Identifier = lexeme [alpha >> *(alnum | '_')];
VarAssignemnt = …Run Code Online (Sandbox Code Playgroud) 我对提升精神队长有困难.
我需要解析一个这样的文件:
ROW int
int [int, int]
int [int, int]
...
Run Code Online (Sandbox Code Playgroud)
只有在第一个int之后添加'_'时,我能够毫无问题地解析它(感谢stackoverflow;).
事实上,我认为船长在第一个int之后吃了行尾,所以第一个和第二个(在第二行)看起来只有一个int.我不明白如何保持eol但是吃空间.我找到了使用自定义解析器的示例,如此处和此处.
我尝试了qi :: blank,自定义解析器,单一规则点亮('')无论我使用什么队长,空间和eol总是吃.
我的语法是:
一行:
struct rowType
{
unsigned int number;
std::list<unsigned int> list;
};
Run Code Online (Sandbox Code Playgroud)
存储在结构中的完整问题:
struct problemType
{
unsigned int ROW;
std::vector<rowType> rows;
};
Run Code Online (Sandbox Code Playgroud)
行解析器:
template<typename Iterator>
struct row_parser : qi::grammar<Iterator, rowType(), qi::space_type>
{
row_parser() : row_parser::base_type(start)
{
list = '[' >> -(qi::int_ % ',') >> ']';
start = qi::int_ >> list;
}
qi::rule<Iterator, rowType(), qi::space_type> start;
qi::rule<Iterator, std::list<unsigned int>(), qi::space_type> list; …Run Code Online (Sandbox Code Playgroud) 寻找能够返回INI文件的行号的一些C++库(如boost :: program_options),其中找到了给定的选项或部分.
用例:
我要求该库在"[SSS]"部分中找到值"vvv".库返回行号,其中找到"[SSS]"部分中的"vvv",或-1.它让我有能力说"第55行:vvv必须<256".
我迭代INI文件的部分并验证他们的名字.当发现一些狂野的部分时,我说:"第55行:[哈哈哈]部分未知".
更新:我知道"INI比猛犸象大",但目前我必须将大型Windows项目移植到跨平台,并且不能很快摆脱.ini文件.