【发布时间】:2013-01-11 13:58:46
【问题描述】:
我对@987654321@ 进行了一些尝试,并尝试重新设计Mathematica 语言的部分内容。我的 BNF 已经有大约 150 行并且工作正常,直到我注意到一个非常基本的错误。 Mathematica 中的括号 [] 用于两种不同的事物
-
expr[arg]调用函数 -
list[[spec]]访问表达式的元素,例如List
假设我想为一种语言创建解析器,该语言只包含标识符、函数调用、元素访问和表达式序列作为参数。这些表格是有效的
f[]
f[a]
f[a,b,c]
f[[a]]
f[[a,b]]
f[a,f[b]]
f[[a,f[x]]]
BNFC 的直接但明显错误的输入文件可能看起来像
entrypoints Expr ;
TSymbol. Expr1 ::= Ident ;
FunctionCall. Expr ::= Expr "[" [Sequence] "]" ;
Part. Expr ::= Expr "[[" [Sequence] "]]" ;
coercions Expr 1 ;
separator Sequence "," ;
SequenceExpr. Sequence ::= Expr ;
此 BNF 不适用于第一个代码块的最后两个示例。
问题似乎出在创建的Yylex lexer 文件中,该文件分别匹配] 和]]。这是错误的,因为从最后一个示例中可以看出,它是关闭 ] 还是 ]] 取决于上下文。因此,要么您必须创建一堆大括号以确保正确匹配,要么将其留给解析器。
有人可以告诉我是否可以通过 BNFC 实现这一点?
(顺便说一句,其他提示也将不胜感激)
【问题讨论】:
-
@HighPerformanceMark 我这里不说前端,我说的是内核,它显然能够正确解析
f[g[x]]。如果我想使用 BNFC 创建(至少)一个不完整的 Mathematica 解析器,我必须为此找到解决方案;不管是不是 Wolfram 的糟糕设计。
标签: parsing wolfram-mathematica bnf bnfc