我玩了一点BNF变换器,并试图重新设计部分的数学语言.我的BNF已经有大约150行了,运行良好,直到我注意到一个非常基本的错误。数学中的括号[]用于两种不同的东西
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是否有可能实现这一点吗?
(顺便说一句,我们也会感激地接受其他暗示)
发布于 2013-01-11 05:58:46
你的问题是象征性的“]”。如果莱克星收集它没有任何记忆的过去,它可能是错误的。所以别这么做!
解析器根据定义记住它的左上下文,因此您可以让它正确地执行括号匹配。
我会这样定义你的语法:
FunctionCall. Expr ::= Expr "[" [Sequence] "]" ;
Part. Expr ::= Expr "[" "[" [Sequence] "]" "]" ; 使用lexer只检测到单个"“作为标记。
奇数变体:
FunctionCall. Expr ::= Expr "[" [Sequence] "]" ;
Part. Expr ::= Expr "[[" [Sequence] "]" "]" ; 也可以检测到"[[“]作为标记,因为它不会弄错。
https://stackoverflow.com/questions/14255057
复制相似问题