gpt4 book ai didi

parsing - 递归下降解析器和嵌套括号

转载 作者:行者123 更新时间:2023-12-02 13:51:44 28 4
gpt4 key购买 nike

我是语法和解析领域的新手。

我正在尝试编写一个递归下降解析器来评估如下字符串:

((3 == 5 AND 4 == 5) 或 (6 == 6 ))

一切对我来说都很好,直到我开始处理嵌套括号。本质上,我发现我太早到达目标字符串的末尾了。

我认为问题是由于当我遇到像“6”或倒数第二个括号这样的标记时,我会对其进行评估,然后移至下一个标记。我会删除用于前进到下一个标记的代码,但随后我不确定如何前进。

我的语法看起来像这样(“=>”符号是我自己的规则“翻译”符号):

测试:IfCompoundSentenceThenCompoundSentence |复合句

CompoundSentence : (CompoundSentence) PCSopt |CompoundSentence 连词|

句子=>

CompoundSentence = (CompoundSentence) PCSopt |句子CSOpt

PCSOpt = ParenConjunction 复合句子 PCSOpt|厄普西隆

CSOpt = 连词句子 CSOpt|厄普西隆

Paren连词:And|Or

连词:And|Or

句子:主语动词前缀

主题:主题中缀值 |值=>

主题=值SubjectOpt

SubjectOpt = 中缀值SubjectOpt |厄普西隆

动词:==|!=|>|<

谓词:谓词中缀值 |值=>

谓词=值PredicateOpt

PredicateOpt = 中缀值 PredicateOpt |厄普西隆

中缀:+、-、*、/

我的复合句代码如下:

    private string CompoundSentence(IEnumerator<Token> ts)
{
// CompoundSentence = ( CompoundSentence ) PCSopt | Sentence CSOpt

string sReturnValue = "";

switch(ts.Current.Category) {

case "OPENPAREN":
{
//Skip past the open parenthesis
ts.MoveNext();

string sCSValue = CompoundSentence(ts);

if(ts.Current.Category != "CLOSEPAREN") {

sReturnValue = "Missing parenthesis at " + ts.Current.OriginalString;
return sError;
}
else {

//Skip past the close parenthesis
ts.MoveNext();
}

sReturnValue = PCSOpt(sCSValue, ts);

break;
}
default:
{
string sSentenceVal = Sentence(ts);

//sSentenceVal is the truth value -- "TRUE" or "FALSE"
//of the initial Sentence component
//CSOpt will use that value, along with the particular conjunction
//and the value of the current token,
//to generate a new truth value.
sReturnValue = CSOpt(sSentenceVal, ts);

break;
}
}

return sReturnValue;
}

正如我所说,我是这个领域的新手,所以我可能不理解一些非常基本的东西。

如果有人能引导我走向正确的方向,我将不胜感激。

最佳答案

对于表达式,手动编码的递归下降解析器非常容易编写。

查看我的SO answer for how to write recursive descent parsers.

一旦掌握了解析器的结构,就可以很容易地在解析时计算表达式。

关于parsing - 递归下降解析器和嵌套括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404482/

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