【问题标题】:BNFC parser and bracket Mathematica like syntaxBNFC 解析器和括号 Mathematica 类语法
【发布时间】:2013-01-11 13:58:46
【问题描述】:

我对@9​​87654321@ 进行了一些尝试,并尝试重新设计Mathematica 语言的部分内容。我的 BNF 已经有大约 150 行并且工作正常,直到我注意到一个非常基本的错误。 Mathematica 中的括号 [] 用于两种不同的事物

  1. expr[arg]调用函数
  2. 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


【解决方案1】:

您的问题是令牌“]]”。如果词法分析器在没有 任何关于它的过去的记忆,它都可能是错误的。所以不要那样做!

根据定义,解析器会记住它的左上下文,所以你可以得到 它可以正确地进行括号匹配。

我会这样定义你的语法:

FunctionCall.   Expr ::= Expr "[" [Sequence] "]" ;
Part.           Expr ::= Expr "[" "[" [Sequence] "]" "]" ;   

词法分析器仅检测单个“[”“]”作为标记。

一个奇怪的变种:

FunctionCall.   Expr ::= Expr "[" [Sequence] "]" ;
Part.           Expr ::= Expr "[[" [Sequence] "]" "]" ; 

词法分析器也将“[[”检测为标记,因为它不会被弄错。

【讨论】:

  • 真正愚蠢的是,我已经有了这个解决方案,并且在尝试时显然没有重新加载类:-( 好的,这有效。谢谢。
  • 另外,lex 左方括号的规则是如果看到两个就取两个,否则取一个(超过两个是错误条件)。对于右手括号,使用解析器的状态来告诉您要放入一个词素中的数量。这样,您就可以区分单括号和双括号的词位。我认为这是正确的做法(: 和 = 都是词位,但您不会单独使用它们来形成 :=)。
  • 天哪,我刚刚意识到我之前的评论以一个无意的表情符号结尾。我希望这预示着世界末日之类的。另一个需要小心词位的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
相关资源
最近更新 更多