【问题标题】:Are the following BNF, EBNF, Regular expressions and Lex syntax correct?以下 BNF、EBNF、正则表达式和 Lex 语法是否正确?
【发布时间】:2015-05-21 08:45:35
【问题描述】:

我希望 BNF、EBNF、正则表达式和 lex 语法能够识别以下内容: 字符串必须以 A、B、C、D 或 E 之一开头,后跟任意数量的 A、B、C、D、E、0、1、2、3、_ 你也可以有 1 或符号 $ 的 0。

到目前为止我做了:

正则表达式

[A-E]([A-E0-9_]*[$]?[A-E0-9_]*)

BNF

<S>::= <letter><Rest>
<Rest>::=<rest1><symbol>|<rest1><symbol><rest1>|<symbol><rest1>|<rest1>|<symbol>
<rest1>::=<character><rest1>|<rest1><character>|<character>
<character>::=A|B|C|D|E|1|2|3|4|_
<letter>::=A|B|C|D|E
<symbol>::=$

EBNF

S=letter{character}[symbol]{character}
letter=|"A"|"B"|"C"|"D"|"E"|
character=|"1"|"2"|"3"|"4"|"A"|"B"|"C"|"D"|"E"|"_"
symbol="$"

^[A-E][A-E0-3_]*[$]?[A-E0-3_]*$

它们是正确的吗?正则表达式 100% 正确我想我对 ebnf、bnf 和 lex 有疑问

【问题讨论】:

    标签: regex lex bnf ebnf


    【解决方案1】:

    有几个问题。参考BNF and EBNF: What are they and how do they work?(最早可用的网络点击之一——如果没有引用的变体,很难提供具体的建议......):

    • 正则表达式和 lex 不一致:您使用“^”来锚定后者,而不是前者。 lex 支持交替“|”就像在正则表达式中一样,在括号内的组中。
    • 在 BNF 中,定义 rest1 的行看起来很奇怪(您的意思是重复使用 rest 吗?)
    • Garshol 的页面不像您在 EBNF 中为 [symbol] 所做的那样使用方括号。相反,他使用*?(如在正则表达式中)。
    • BNF 或 EBNF 都不显示数字 0-9 的使用
    • 其实正则表达式用的是0-9,但是问题陈述是0-3

    ---希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多