【问题标题】:Create a top down parser based on a custom language基于自定义语言创建自上而下的解析器
【发布时间】:2026-02-13 07:05:02
【问题描述】:

考虑由

定义的语言 (Σ,R,S)
Σ = { ′(′, ′)′ }  
R = {S → SS, S → (S), S → ϵ }

1.这种语言的语法是什么?不只是生产规则列表,因此是 R 吗?如果不是,语法与产生式规则列表有何区别?

2.然后我该如何根据这个语法创建一个自上而下的解析器?我看到它提到涉及堆栈。

我的教授已经提供了一个标记器,但老实说,我不知道如何在代码中实现它 (C++)。

编辑:包含对 DFA 的引用,现在看起来它们似乎无关,因此可能是对项目描述的误解

【问题讨论】:

  • Re #1:IIUC 你不能,没有有限状态自动机可以识别平衡括号的语言。
  • 如果您被要求为该语言编写 DFA,您可能会被要求使用泵引理证明它在 DFA 等效正则语言集合中的成员身份。如果您不小心提到了 DFA,请查看递归(您可能还想编辑问题)。

标签: parsing compiler-construction grammar


【解决方案1】:

语法可以写成:

S  = 
   | '(', S, ')', S
   ;

我为解析器添加了一些伪代码。首先是访问和操作令牌流的函数。

IsEof: Bool // checks for end of token stream
Get: Token   // gets next token
Peek: Token // peeks next token without removing it

然后是解析器。 S 被识别为一个空的令牌流,或者是一个紧跟另一个 S 的括号集。

Parse_S
  // If no tokens left, there is a match.
  if (IsEof) return True // OK
  // Expect at least one paren set, but possibly more
  else return (Peek == '(') && (Parse_ParenSet) && (Parse_S)

paren set 是一个用括号括起来的 S。

Parse_ParenSet
  // Expect a paren set.
  if (IsEof) return False // Error
  // Expect an S enclosed in Parenthesis.
  else return (Get == '(') && (Parse_S) && (Get == ')')

现在你应该可以继续作业了。

【讨论】: