gpt4 book ai didi

c# - 解析没有花括号的代码块的技巧

转载 作者:太空狗 更新时间:2023-10-30 01:12:43 25 4
gpt4 key购买 nike

我正在用 C# 从头开始​​编写一个简单的解析器/解释器(没有第三方库)。它编译为字节码,然后我有运行字节码的类。我快要结束了。我刚刚实现了 whilefor 循环,并且正在研究 if|else if|else block 。

就目前而言,我的解析器要求所有这些结构都使用大括号。我想让它更像 C,并且当 block 只包含一个语句时花括号是可选的。这给我带来了麻烦。

if (condition)
{
// Make curly braces optional when there is just one statement here
}

问题是跟踪状态。解析器如何知道没有花括号的 block 何时结束。一种方法是检查在每条语句之后是否有一个没有生效的大括号 block 。然而,有很多不同的场景可以构成一个声明,因此这些检查需要在很多地方进行。这对我来说有点脆弱。

我只是想知道是否有人这样做过并且知道在没有花括号的情况下跟踪代码块何时结束的巧妙技巧。

最佳答案

你需要调查recursive descent parser .它使创建解析器变得容易得多。假设您的语法如下所示:

statement
: 'if' paren_expr ['{'] statement ['}']

paren_expr
: '(' expr ')'

然后使用递归下降你可以做这样的事情:

public void Statement()
{
if(curToken == Token.If)
{
Eat(Token.If); // Eat is convenience method that moves token pointer on
if(curToken == Token.LParen)
{
Eat(Token.LParen)
ParenExpr();
Eat(Token.RParen);
}
if(curToken == Token.LBrace) // this will signify a block of statements
{
Eat(Token.LBrace);
while(curToken != Token.RBrace)
Statement();
Eat(Token.RBrace);
}
else
Statement();
}
}

public void ParenExpr()
{
// do other token checks
}

对所有非终端执行此操作,您可以轻松构建 AST,并从中生成字节码。

关于c# - 解析没有花括号的代码块的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56160457/

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