gpt4 book ai didi

parsing - Lemon LALR 解析器的简单语法

转载 作者:行者123 更新时间:2023-12-02 16:40:57 26 4
gpt4 key购买 nike

我已经被这个问题困扰了一段时间了。我想解析一些简单的东西:

喜欢:word1 word2 .. wordN 讨厌:word1 word2 .. wordN

我正在使用柠檬+Flex。目前我的语法看起来像这样:

%left LIKES MOODS FROM HATES INFO.

%syntax_error {
std::cout << "Syntax error!" << std::endl;
}

final ::= likes_stmt.
final ::= hates_stmt.

likes_stmt ::= LIKES list(A). { Data *data=Data::getInstance();data->likes.push_back(A);}
hates_stmt ::= HATES list(A). { Data *data=Data::getInstance();data->hates.push_back(A);}

list ::= likes_stmt VALUE(A). { Data *data=Data::getInstance();data->likes.push_back(A);}
list ::= hates_stmt VALUE(A). { Data *data=Data::getInstance();data->hates.push_back(A); }

list(A) ::= VALUE(B). {A=B;}

但这仅适用于前 2 个单词。显然我做错了什么,可能是在递归定义中?如有任何提示,我们将不胜感激:)

最佳答案

@crozzfire,Ira 为您的原始问题提供了正确答案,请考虑投票。

让我回答这个问题,并附加要求将解析值分成两个列表。不要创建不同的规则来解析这些列表,因为两种情况下列表的语法是相同的。您需要的是一个标志来指示列表前面是否找到了“喜欢”或“讨厌”。 Lemon 的 Parse 函数的第四个参数最适合这种需求。请参阅 Lemon documentation 的“解析器接口(interface)”部分.

下面是更新的 Ira 语法,用于设置和检查此类标志变量。请注意,规则 set_likes_stateset_hites_state 需要放置在 LIKES 和 HATES token 之前,以便在 token 减少时执行关联操作。

    %extra_argument {unsigned* state}

final ::= likes_stmt.
final ::= hates_stmt.

likes_stmt ::= set_likes_state LIKES list(A).
hates_stmt ::= set_hites_state HATES list(A).

list ::= list VALUE(A). { if (*state == 0) {/*add A to list1*/} else {/*add A to list2*/}; }
list ::= VALUE(A). { if (*state == 0) {/*add A to list1*/} else {/*add A to list2*/}; }

set_likes_state ::= . { *state = 0; }
set_hites_state ::= . { *state = 1; }

关于parsing - Lemon LALR 解析器的简单语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6767440/

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