给定一个LL(1)语法,什么样的数据结构或算法适合以函数式纯方式生成不可变的具体语法树?请随意使用您喜欢的任何语言编写示例代码。
我的想法
symbol:标记或节点
result:成功或失败
token:源文本中的词汇标记 value->string:标记的值 type->integer:标记的命名类型代码 next->token:读取下一个标记并保留上一个标记的位置 back->token:返回到上一个位置并重新读取标记
node:语法树中的节点 type->integer:节点的命名类型代码 symbols->linkedList:在此节点找到的符号 append->symbol->node:将新符号附加到新副本的节点中
这是我一直在思考的一个想法。主要问题在于处理语法错误。 我的意思是,我可以在第一个错误处停止,但那似乎不对。
let program token =
sourceElements (node nodeType.program) token
let sourceElements node token =
let (n, r) = sourceElement (node.append (node nodeType.sourceElements)) token
match r with
| success -> (n, r)
| failure -> // ???
let sourceElement node token =
match token.value with
| "function" ->
functionDeclaration (node.append (node nodeType.sourceElement)) token
| _ ->
statement (node.append (node nodeType.sourceElement)) token
请注意
我将为最佳答案提供慷慨的奖励,所以不要感到匆忙。仅发布链接的答案比展示代码或包含详细解释的答案权重更小。
最后声明
我对这种东西真的很新,所以不要害怕称呼我为笨蛋。