BNF 将字符串字面量赋值给一个变量

BNF assign string literal to a variable

我正在尝试编写一些 BNF(不是 EBNF)来描述以下代码片段的各种元素,这些代码片段不是特定的编程语言,但在 VBA.

中语法是正确的
If Temperature <=0 Then
   Description = "Freezing"
End If

到目前为止,我已经在这个 post 的底部提出了 BNF(我还没有描述字符串、数字或标识符)。

令我困惑的是第二行代码,Description = "Freezing",我在其中将字符串文字分配给标识符。我应该如何在我的 BNF 中处理这个问题?

我很想简单地调整我对这样一个因素的定义...

<factor> ::= <identifier> | <number> | <string_literal> | (<expression)>

...毕竟,在 VBA 中,包含字符串或字符串变量的算术表达式在句法上是正确的,直到 运行 时间才被提取。例如 (4+3)*(6-"hi") 不会被识别为语法错误。这是正确的方法吗?

或者我应该保留某个因素的产生式并像这样重新定义分配...?

<assignment> ::= <identifier> = <expression> | <identifier> = <string_literal>

我并不是要在我的 BNF 中定义一个完整的语言,相反,我只是想涵盖描述代码片段的大部分作品。将不胜感激。

BNF 到目前为止...

<string> ::= …
<number> ::= …
<identifier> ::= …
<assignment> ::= <identifier> = <expression>
<statements> ::=  <statement> <statements>
<statement> ::= <assignment> | <if_statement> | <for_statement> | <while_statement> | …
<expression> ::= <expression> + <term> | <expression> - <term> | <term>
<term> ::= <term> * <factor> | <term> / <factor> | <factor>
<factor> ::= <identifier> | <number> | (<expression)>
<relational_operator>  ::=  < | > | <= | >= | = 
<condition> ::= <expression> <relational_operator>  <expression> 
<if_statement> ::= If <condition> Then <statement>
    | If <condition> Then <statements> End If
    | If <condition> Then <statements> Else <statements> End If

考虑代码示例:

X = "hi"
Y = 6 - X

6 - X 表达式是一个错误,但您不能仅使用 context-free 语法将其变为语法错误。同样适用于:

If Temperature <= X Then ...

您不必通过语法捕获此类类型错误,而必须稍后以静态或动态方式捕获它们。并且鉴于无论如何您都必须进行该分析,因此尝试在语法中捕获 any 类型错误(表达任何类型约束)没有多大意义。

所以使用您的第一个解决方案,将 <string_literal> 添加到 <factor>

虽然您没有提供有关您的语言的任何详细信息,但似乎有理由相信具有字符串文字和字符串变量的语言也对字符串进行一些操作,至少函数调用以字符串作为参数并且可能某些运营商。 (在 VB 中,据我了解,+& 都用作字符串连接运算符。)

在那种情况下,对字符串变量的赋值不仅限于分配字符串文字,而且语法应该允许包含字符串文字的表达式。

在某些类型错误(例如 6 - "hi")可以立即被检测到的基础上,尝试在语法中强制类型一致性总是很诱人。但是还有许多其他非常相似的错误 (6 - HiStringVariable) 在类型推导之前无法检测到(对于动态语言甚至是在运行时)。在解析期间进行部分类型检查所需的扭曲几乎不值得麻烦。