【问题标题】:Reading EBNF Grammar阅读 EBNF 语法
【发布时间】:2017-11-05 04:13:34
【问题描述】:

我只是在阅读这个 EBNF 语法时需要帮助,我是新手,不是特别理解第一个,我理解第二个,但只是不明白它与第一个的关系。

Term ::= Primary { (T_STAR|T_SLASH) Term }

主要 ::= T_ICONST | T_SCONST | T_ID | T_LPAREN Expr T_RPAREN

【问题讨论】:

  • 看看here。它有一个很好的简单解释。顶部规则意味着符号 Term 被转换为符号 Primary,然后大括号中的符号重复零次或多次。
  • 所以它会类似于“术语被定义为..(Primary 中的所有内容){(T_STAR|T_SLASH) 术语}”但是现在第二个术语是什么意思?
  • 将规则解读为Term 可以转到right hand side。它更多的是一种转换而不是定义。第二条规则只是意味着符号Primary可以转换为规则右侧由|分隔的任一符号。
  • 我现在有点明白了,但是假设我想解析 Primary,我将如何去做。
  • 您可以将其替换为规则右侧的任何符号。因此,在这种情况下,您可以通过 4 种方法来转换 Primary。递归解析器根据规则检查符号并沿规则集向下移动,直到成功或失败

标签: grammar ebnf


【解决方案1】:

在 EBNF 中,用大括号括起来的表达式可以省略或重复更多时间 所以我们可以根据这个EBNF构造一些代码(假设T_STAR代表字符“*”和T_SLASH代表“/”)

// Term ::= Primary { (T_STAR|T_SLASH) Term }
// Primary ::= T_ICONST | T_SCONST | T_ID | T_LPAREN Expr T_RPAREN
Term ::= Primary * Term
Term ::= Primary * Primary / Term
Term ::= Primary * Primary / Primary 
Term ::=  ThisIsT_ID * ThisIsT_ID / ThisIsT_ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多