【问题标题】:How can I transform an Extended Backus Naur Grammar to its normal representation?如何将扩展巴科斯瑙尔语法转换为其正常表示?
【发布时间】:2014-10-13 13:32:14
【问题描述】:

我有一个语法,它包含括号“{}”之间的表达式,表示该表达式的 0 次或多次,方括号“[]”之间的表达式表示该表达式的 1 倍或没有,我认为这种语法被称为扩展巴科斯-瑙尔形式语法。 我想将语法转换为正常形式(没有括号也没有方括号)。

是否有现有的算法可以做到这一点?

我知道我可以将 A--> B[CD]E 替换为 A-->BE, A--> BCDE,但我想知道是否存在可以实现的现有算法以便转换这些表达式。

【问题讨论】:

    标签: algorithm parsing grammar context-free-grammar ebnf


    【解决方案1】:

    最直接的方法是用新规则替换每个 EBNF 构造。以下是您可以使用的等价物:

    选项

    A ::= B [C D] E ;
    
    A ::= B X E ;
    X ::= C D | ɛ ;
    

    其中 ɛ 表示空字符串。

    重复

    A ::= B {C D} E ;
    

    零次或多次:

    A ::= B X E ;
    X ::= C D X | ɛ ;
    

    一次或多次:

    A ::= B X E ;
    X ::= C D | C D X ;
    

    分组

    A ::= B (C D) E ;
    
    A ::= B X E ;
    X ::= C D ;
    

    递归地应用这些转换,你最终会得到普通的 BNF。

    【讨论】:

    • 非常感谢!这种转换没有具体的名称吗?
    • 我确信一定有一个特定的术语,但现在我似乎不记得它是什么......
    • 你好,我在考虑用'{}'替换,我想另一种写法是X--> CD| '#'。其中“#”是 epsilon。
    • @Pablo 是的,这是真的。我必须承认我不太记得正式的语法。由于 epsilon 表示空字符串,这将是正确的编写方式(我编辑了答案)。
    • 更正我之前的评论,'{}' 可以替换为 X--> CDX| '#'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多