基于自定义语言创建自顶向下解析器

时间:2014-02-08 19:07:47

标签: parsing compiler-construction grammar

考虑由

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

1。这种语言的语法是什么?它不仅仅是生产规则清单,因此R?如果没有,那么语法与生产规则列表有什么区别?

2. 我如何根据此语法创建自上而下的解析器?我已经看到它提到了堆栈。

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

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

1 个答案:

答案 0 :(得分:2)

语法可以写成:

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的paren集。

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集是括在括号中的S.

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

现在你应该可以继续分配了。