BNF将字符串文字分配给变量

时间:2018-03-22 06:28:50

标签: compilation context-free-grammar bnf

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

If Temperature <=0 Then
   Description = "Freezing"
End If

到目前为止,我已经在这篇文章的底部提出了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

2 个答案:

答案 0 :(得分:0)

考虑代码示例:

class Test extends React.Component {

  constructor(props){
    super(props)
    this.state={ likes:0 }
    this.anchorElement=null;
  }

  enter = () => { this.anchorElement.href='javascript:;'; }
  leave = () => { this.anchorElement.href='http://www.google.com'; }
  handleClick = () => { this.setState({ likes: ++this.state.likes}); }

  render() {
    return (
      <div>
        <div>{'Likes:'+this.state.likes}</div>
        <a href="http://www.google.com" ref={(el) => { if (el) { this.anchorElement = el; } }}>
          <div>
            <h2 className="title">Random Title</h2>
            <button onClick={this.handleClick} onMouseEnter={this.enter} onMouseLeave={this.leave}> Like </button>
          </div>
        </a>
      </div>
    );
  }
}

X = "hi" Y = 6 - X 表达式是一个错误,但您不能仅使用无上下文语法使其成为语法错误。同样适用于:

6 - X

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

请继续使用您的第一个解决方案,将If Temperature <= X Then ... 添加到<string_literal>

答案 1 :(得分:0)

虽然您没有提供有关您的语言的任何详细信息,但是相信具有字符串文字和字符串变量的语言对字符串也有一些操作似乎是合理的,至少函数调用将字符串作为参数并且可能确定运营商。 (在VB中,据我所知, + &amp; 作为字符串连接运算符。)

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

尝试在语法中强制执行类型一致性总是很诱人,因为可以立即检测到某些类型错误(例如6 - "hi")。但是还有许多其他非常类似的错误(6 - HiStringVariable),直到类型推断(甚至直到运行时,动态语言)才能检测到。在解析过程中进行部分类型检查所需的扭曲几乎不值得麻烦。