【问题标题】:How do you write Perl statement $age = 25; in BNF or EBNF你怎么写 Perl 语句 $age = 25;在 BNF 或 EBNF
【发布时间】:2018-09-07 15:19:14
【问题描述】:

如何转换 Perl 语句 $age = 25;转 BNF 还是 EBNF 语法?

【问题讨论】:

  • 欢迎来到stackoverflow。这不是免费的代码编写服务。到目前为止你尝试了什么?请edit您的问题并将您的代码发布为minimal reproducible example!运行时发生了什么?你期望会发生什么?您具体遇到了什么问题?

标签: perl bnf ebnf


【解决方案1】:

我会写一个语法,也许是这样的

<statement> ::= <assignment> ";"
<assignment> ::= <lhs> "=" <rhs>
<lhs> ::= <var>
<rhs> ::= <expr>
<var> ::= ("@" | "$" | "%" | "*") <name>
<expr> ::= <var> | <number>

这将匹配一系列 Perl-ish 分配(给定 &lt;name&gt;&lt;number&gt; 的合适定义);不仅是你写的,还有

$age = 25;
@foo = $bar;
%baz = 9999999;

Perl 有一些语法复杂性,因此很难在这个级别进行全面检查(考虑表达式 $foo$foo{bar}$foo-&gt;{bar} 之间的差异)但是如果你愿意做第二遍类型检查应该是一个相当典型的语句和表达式语法。

【讨论】:

  • Re "考虑表达式$foo$foo{bar}$foo-&gt;{bar}之间的差异",实际上可以很容易地处理BNF。两个真正的问题是 1) Perl 有歧义(例如{} 既可以是裸循环也可以是哈希构造函数),以及 2) 程序的早期部分会影响后面部分的解析方式(例如原型和 @987654332 @ 块)。
  • &lt;lhs&gt; "=" &lt;rhs&gt; 应该是 &lt;expr&gt; "=" &lt;expr&gt;。赋值的 LHS 上允许使用任何表达式。 (不过,解析器执行的左值检查稍后可能会导致错误)
  • ; 更像是语句分隔符而不是语句终止符;仅当后面有另一个语句时才需要。
  • 您似乎试图列出所有印记,但错过了&amp;
猜你喜欢
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2021-03-14
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多