首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BNFC解析器和类似数学的语法

BNFC解析器和类似数学的语法
EN

Stack Overflow用户
提问于 2013-01-10 09:56:22
回答 1查看 521关注 0票数 4

我玩了一点BNF变换器,并试图重新设计部分的数学语言.我的BNF已经有大约150行了,运行良好,直到我注意到一个非常基本的错误。数学中的括号[]用于两种不同的东西

  1. 调用函数的expr[arg]
  2. list[[spec]]来访问表达式的元素,例如List

让我们假设我想为一种语言创建解析器,它只包含标识符、函数调用、元素访问和表达式序列作为参数。这些表格是有效的。

代码语言:javascript
复制
f[]
f[a]
f[a,b,c]
f[[a]]
f[[a,b]]

f[a,f[b]]
f[[a,f[x]]]

用于BNFC的直接但明显错误的输入文件可能如下所示

代码语言:javascript
复制
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是否有可能实现这一点吗?

(顺便说一句,我们也会感激地接受其他暗示)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-11 05:58:46

你的问题是象征性的“]”。如果莱克星收集它没有任何记忆的过去,它可能是错误的。所以别这么做!

解析器根据定义记住它的左上下文,因此您可以让它正确地执行括号匹配。

我会这样定义你的语法:

代码语言:javascript
复制
FunctionCall.   Expr ::= Expr "[" [Sequence] "]" ;
Part.           Expr ::= Expr "[" "[" [Sequence] "]" "]" ;   

使用lexer只检测到单个"“作为标记。

奇数变体:

代码语言:javascript
复制
FunctionCall.   Expr ::= Expr "[" [Sequence] "]" ;
Part.           Expr ::= Expr "[[" [Sequence] "]" "]" ; 

也可以检测到"[[“]作为标记,因为它不会弄错。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14255057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档