考虑由
定义的语言(Σ,R,S
)
Σ = { ′(′, ′)′ }
R = {S → SS, S → (S), S → ϵ }
1。这种语言的语法是什么?它不仅仅是生产规则清单,因此R?如果没有,那么语法与生产规则列表有什么区别?
2. 我如何根据此语法创建自上而下的解析器?我已经看到它提到了堆栈。
我的教授已经提供了一个标记器,但老实说我不知道如何将其实现到代码中(C++
)。
编辑:包含对DFA的引用,现在看起来它们是无关的,所以它可能是对项目描述的误解
答案 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 == ')')
现在你应该可以继续分配了。