我用BNF Converter稍微玩了一下,并尝试重新设计Mathematica语言的部分。我的BNF已经有大约150行,工作正常,直到我注意到一个非常基本的错误。在Mathematica中,方括号
一个直接但明显有误的BNFC输入文件可能如下所示:
这个BNF不能处理第一个代码块的最后两个示例。问题似乎在于创建的Yylex词法分析器文件中,它将]和]]分别匹配。这是错误的,因为可以看到在最后两个示例中,无论是关闭]还是]],都取决于上下文。因此,要么您必须创建一个括号堆栈来确保正确匹配,要么将其留给解析器。有人能告诉我是否可能用BNFC实现这一点吗?(顺便说一句,其他提示也将不胜感激)
[]
用于两个不同的事情:
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词法分析器文件中,它将]和]]分别匹配。这是错误的,因为可以看到在最后两个示例中,无论是关闭]还是]],都取决于上下文。因此,要么您必须创建一个括号堆栈来确保正确匹配,要么将其留给解析器。有人能告诉我是否可能用BNFC实现这一点吗?(顺便说一句,其他提示也将不胜感激)
f[g[x]]
。如果我想使用BNFC创建(至少)一个不完整的Mathematica解析器,我必须找到一个解决方案;无论Wolfram是否存在设计问题。 - halirutan