作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想弄清楚 Lemon 解析器生成器,所以我写了一个小测试来帮助自己完全理解。文件生成没有问题,编译器也没有提示,但是当我尝试运行它时,我遇到了段错误。我做错了什么?
词典.l:
%{
#include "grammar.h"
%}
%option noyywrap
%%
[A-Za-z_][A-Za-z0-9]* return IDENTIFIER;
\".*\" return STRING;
[0-9]+ return NUMBER;
"=" return EQUALS;
\n return NEWLINE;
%%
语法:
%include {
#include <vector>
#include <iostream>
#include <cassert>
#include <sstream>
#include "AST.h"
}
%token_type {char *}
%extra_argument {std::vector<Identifier>& identifiers}
start ::= assignments. {
std::cout << "start resolved" << std::endl;
}
assignments ::= assignment.
{
std::cout << "assignments resolved" << std::endl;
}
assignments ::= assignments NEWLINE assignment.
assignment ::= IDENTIFIER(id) EQUALS STRING(str).
{
std::cout << "I get here too" << std::endl;
identifiers.push_back(Identifier(id, str));
}
assignment ::= IDENTIFIER(id) EQUALS NUMBER(num).
{
std::stringstream ss;
ss << num;
identifiers.push_back(Identifier(id, ss.str()));
}
主要.cpp:
#include "AST.h"
using namespace std;
void* ParseAlloc(void* (*allocProc)(size_t));
void Parse(void*, int, char *, vector<Identifier>&);
void ParseFree(void*, void(*freeProc)(void*));
int yylex();
extern char * yytext;
int main() {
vector<Identifier> identifiers;
void* parser = ParseAlloc(malloc);
cout << "Line 20" << endl;
while (int lexcode = yylex()) {
cout << "Getting in the loop: " << yytext << endl;
Parse(parser, lexcode, yytext, identifiers);
}
Parse(parser, 0, NULL, identifiers);
cout << "Line 25" << endl;
ParseFree(parser, free);
return 0;
}
AST.h:
#include <string>
#include <iostream>
class Identifier {
std::string name;
std::string value;
public:
Identifier(std::string _name, std::string _value)
: name(_name),
value(_value) {
std::cout << "Initializing " << name << " as " << value << std::endl;
}
std::string getName();
std::string getValue();
void setValue(std::string _value);
};
AST.cpp:
#include "AST.h"
std::string Identifier::getName() {
return name;
}
std::string Identifier::getValue() {
return value;
}
void Identifier::setValue(std::string _value) {
value = _value;
}
最后是测试输入:
alpha = "Hello"
beta = "World"
gamma = 15
输出:
mikidep@mikidep-virtual:~/Scrivania/bison test$ cat text | ./parserLine 20
Getting in the loop: alpha
Segmentation Fault
最佳答案
用指针表示std::vector
标识符。我不确定它是如何没有出现在编译错误中的,但是在代码的某处它会尝试将属性归因于类型为 std::vector<Identifier>&
的变量。 .如果我没记错的话,你不能对引用文献进行归属。
因此,更改为 std::vector<Identifier>*
解决您的问题。
关于c++ - 柠檬在 C++ 中生成的解析器的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28285902/
我使用 Lemon 作为解析器生成器,如果您不了解 Lemon,它的错误处理与 yacc 和 bison 的相同。 Lemon 有一个选项可以在一组规则中定义错误标记,以捕获解析错误。生成的解析器的默
这是我的柠檬解析器语法 %nonassoc IMPLICATION. %nonassoc PERIOD. %nonassoc NEWLINE. %nonassoc END. %nonassoc STR
我正在尝试学习这个 spring-lemon 入门教程 ( https://naturalprogrammer.gitbooks.io/spring-lemon-getting-started/con
我是一名优秀的程序员,十分优秀!