gpt4 book ai didi

c++ - 消除 spirit x3 解析器规则中的左递归

转载 作者:可可西里 更新时间:2023-11-01 15:27:44 26 4
gpt4 key购买 nike

我目前坚持使用 boost spirit x3 解析的规则。这是我要解析的 EBNF(使用 spirit 中的 % 运算符作为列表):

type ::= class_type | lambda_type

lambda_type ::= more_arg_lambda | one_arg_lambda

more_arg_lambda ::= "(", type%",", ")", "=>", type

one_arg_lambda ::= type, "=>", type <- here is the left recursion

class_type ::= identifier%"::", ["<", type%",", ">"]

使用 boost spirit x3,我试图解析为以下结构/变体:

typedef x3::variant<
nil,
x3::forward_ast<LambdaType>,
x3::forward_ast<ClassType>
> Type;

struct LambdaType {
std::vector<Type> parameters_;
Type return_type_;
};
struct ClassType{
std::vector<std::string> name_;
std::vector<Type> template_args_;
};

我有一个我目前正在尝试的实例 here ,这不起作用,我还尝试更改变体解析器的顺序,这没有帮助,我得到无休止的递归,或者不是我期望(或希望)的行为。

谁能帮我调试这个解析器?

我想我在解析器中有某种​​类型的左递归,是否有机会避免这种情况或者没有机会重写语法?这个语法甚至可以用 boost spirit x3 解析吗?

编辑:

我设法消除了这个语法中的左递归。现在语法如下:

type ::= class_type | lambda_type

lambda_type ::= more_arg_lambda | one_arg_lambda

more_arg_lambda ::= "(", type%",", ")", "=>", type

one_arg_lambda ::= class_type, "=>" type, A
| "(", type%",", ")", "=>", type, "=>", type, A

class_type ::= identifier%"::", ["<", type%",", ">"]

A::= "=>", type, A | eps

但是现在有下一个问题,我怎样才能使boost spirit x3将这些规则解析为给定的结构?我无法想象 Aone_arg_lambda 解析器现在返回什么,one_arg_lambda 解析器应该解析成 LambdaType struct,但取决于 A 解析成的内容,现在不一定是真的。所以现在的问题是,我怎样才能得到一个非左递归解析器,它使用 boost-spirit-x3 将上面的语法解析到我的结构中?

编辑二:

我希望 => 是正确的关联所以 foo => bar => baz => baham
表示 foo => (bar => (baz => bahama))

最佳答案

我解决了这个问题,而且解决方案非常简单。诀窍是改变语法,所以我没有左递归,它很好地解析到我的结构中。

所以我改变了

type ::= class_type | lambda_type

lambda_type ::= more_arg_lambda | one_arg_lambda

more_arg_lambda ::= "(", type%",", ")", "=>", type

one_arg_lambda ::= type, "=>", type <- here is the left recursion

class_type ::= identifier%"::", ["<", type%",", ">"]

type ::= class_type | lambda_type

lambda_type ::= more_arg_lambda | one_arg_lambda

more_arg_lambda ::= "(", type%",", ")", "=>", type

one_arg_lambda ::= class_type, "=>", type <- here is the magic trick

class_type ::= identifier%"::", ["<", type%",", ">"]

第二个文法描述了完全相同的语言,但没有左递归,也没有改变文法的结构。这实际上是运气,显然并不适用于所有语法。

关于c++ - 消除 spirit x3 解析器规则中的左递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39949480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com