gpt4 book ai didi

javascript - PEGJS:为谓词优先语法生成 AST

转载 作者:行者123 更新时间:2023-11-29 18:09:10 25 4
gpt4 key购买 nike

我又回到探索 pegjs 并且显然还没有掌握核心概念。我正在尝试解析以谓词开头然后是操作数列表(可能包含另一个谓词)的“查询语言”。所以一个简单的例子是:

OR(
"string1"
"string2"
)

我想把上面的转换成:

{
predicate: "OR",
operands: [
{
type: "STRING",
value: "string1"
},
{
type: "STRING",
value: "string2"
}
]
}

这个查询:

OR(
"string1"
"string2"
AND (
"string4"
"string5"
)
"string3"
)

将成为这个 AST:

{
predicate: "OR",
operands: [
{
type: "STRING",
value: "string1"
},
{
type: "STRING",
value: "string2"
},
{
predicate: "AND"
operands: [
{
type: "STRING",
value: "string4"
},
{
type: "STRING",
value: "string5"
}
]
},
{
type: "STRING",
value: "string3"
}
]
}

我的语法很接近,但有几个问题。这是当前的 PEGJS 语法。它可以直接粘贴到在线 pegjs 解析器 ( http://pegjs.majda.cz/online )。

start =
or_predicate

or_predicate
= ws* "OR" ws* "(" ws* operands:or_predicate ws* ")" ws*
{ if(Array.isArray(operands)) {
return {predicate: "OR", operands: operands}
} else {
return {predicate: "OR", operands: [operands] }
}
}
/ and_predicate

and_predicate
= ws* "AND" ws* "(" operands:and_predicate ")"
{ if(Array.isArray(operands)) {
return {predicate: "AND", operands: operands}
} else {
return {predicate: "AND", operands: [operands] }
}
}
/ operands

operands
= ws* values:operand+ { return values; }

operand =
string
/ ws or_predicate:or_predicate { return or_predicate; }

string =
ws* "\"" value:valid_variable_characters "\""
{ return { type: "STRING", value: value.join("")}}

// List of valid characters for string variables
valid_variable_characters =
[a-zA-Z0-9 _]+

ws =
[ \t\n]

上面的语法处理了我给出的两个例子,但我注意到两个问题,这让我想到了以下三个问题。

1.语法在这个看似简单的输入上失败了(关键是嵌套的 OR 紧跟在父 OR 之后,“字符串”在末尾):

OR(
OR (
"string1"
)
"string2"
)

我不确定是什么原因造成的,也不知道如何解决。

2.语法目前有这个愚蠢的operand规则行:

operand =
string
/ ws or_predicate:or_predicate { return or_predicate; }

请注意第三行 or_predicate 之前的前导空格 (ws)。如果没有那个空格,我会收到错误“超出最大调用堆栈大小”。我认为这与左递归有关,但对此并不积极。理想情况下,我希望能够没有必需的“ws”,这样没有空格的查询就可以了:

OR("string1"OR("string2")"string3")

现在你必须像这样人为地添加一些额外的空格:

OR("string1" OR("string2") "string3")

3.我是否完全错误地处理了这个语法?这只是我尝试过的第二个,第一个是基于 pegjs 算术示例,所以我意识到我可能会完全错误地解决这个问题,这可能就是我遇到这些问题的原因。

感谢您的协助和时间!

最好的问候,

埃德

最佳答案

我对 PEG 也很陌生,但在主要查看 examples 之后你就掌握了它的窍门。而不是阅读文档。

尝试将您的版本与这个版本进行比较:

start
= ws* predicate:predicate ws* { return predicate; }

predicate
= "OR" ws* "(" operands:operand+ ")" { return { predicate: 'OR', operands: operands }; }
/ "AND" ws* "(" operands:operand+ ")" { return { predicate: 'AND', operands: operands }; }

operand
= ws* predicate:predicate ws* { return predicate; }
/ ws* string:string ws* { return string; }

string
= "\"" chars:valid_variable_characters+ "\"" { return { type: "STRING", value: chars.join("")}}

valid_variable_characters = [a-zA-Z0-9 _]
ws = [ \t\n]

空格是可选的。

OR("str1"OR("str2""str3"AND("str4""str5"))"str6")

给予:

{
"predicate": "OR",
"operands": [
{
"type": "STRING",
"value": "str1"
},
{
"predicate": "OR",
"operands": [
{
"type": "STRING",
"value": "str2"
},
{
"type": "STRING",
"value": "str3"
},
{
"predicate": "AND",
"operands": [
{
"type": "STRING",
"value": "str4"
},
{
"type": "STRING",
"value": "str5"
}
]
}
]
},
{
"type": "STRING",
"value": "str6"
}
]
}

关于javascript - PEGJS:为谓词优先语法生成 AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28976751/

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