当前位置: 首页 > 面试题库 >

简洁的语法来解析诸如“ abab”或“ baba”之类的交替字符的字符串

冯胤
2023-03-14
问题内容

我正在用golang开发玩具解析器,只是为了学习语言。我添加了一个包含语法的测试案例,涉及以下案例:

Valid:
a, ab, aba, ababababababa, ababababab
b, ba, bab, babababababab, bababababa

Invalid:
abb, baa

a总是紧随其后,b反之亦然。

现在解析器中的语法看起来像这样(为了简洁起见,我省略了周围的代码):

    "expr": Or(Ref("A"), Ref("B")),
    "A": And(
        a,
        Optional(
            And(
                b,
                Optional(Ref("A"))))),
    "B": And(
        b,
        Optional(Ref("A")))

哪里

a - exact match for "a" character
b - exact match for "b" character
"A", "B", "expr" - names of the parts of the grammar that can be referred
                   later with Ref("A")
And      - consume sequence of expressions
Or       - consume any of the expressions
Ref      - refer to other expression (allows recursion)
Optional - make the expression non-obligatory

我想这不是描述这种语法的最简洁的方法。如何使其更紧凑?

有关:

  • 为什么递归下降解析器不能处理左递归

编辑:

Filip的BNF答案可以用我的语法写成:

    "expr": Or(Ref("A"), Ref("B")),
    "A":    Or(And(a, Ref("B")), a),
    "B":    Or(And(b, Ref("A")), b)

问题答案:

您拥有的BNF语法是这样的:

expr ::= A | B
A ::= "a" B | "a"
B ::= "b" A | "b"

我认为可以使用您的语法将此翻译为:

"expr": Or(Ref("A"), Ref("B")),
"A": And(
    a,
    Optional(Ref("B"))),
"B": And(
    b,
    Optional(Ref("A")))

请注意,在非端子()之前检查端子("a""b")很重要Ref(x),否则会出现无限循环。它将始终尝试查看它是否可以匹配另一个字符串AB该字符串的末尾,然后匹配另一个字符串,从而导致永无止境的递归。



 类似资料:
  • 问题内容: 我试图遍历一个字符数组,并将字符串中的该字符替换为另一个数组中的并行字符。 这是我得到的例子: 它总是输出相同的字符串,没有替换。 我也尝试使用: 和replaceAll方法。 有什么建议? 问题答案: 字符串在Java中是不可变的。不会 更改 您调用它的字符串-它会 返回 更改后的新字符串。所以你要: (对于要在其上“显示”更改的 所有 方法,这都是不变的,因此也是如此。)

  • 问题内容: 表: 值: 我想之前替换字符串用。 结果: 如何使用子字符串和基于字符串中的字符进行替换? 问题答案: 您甚至不需要使用或,您可以使用以下命令: 您可以使用以下方法进行测试:

  • 本文向大家介绍JavaScript中最简洁的编码html字符串的方法,包括了JavaScript中最简洁的编码html字符串的方法的使用技巧和注意事项,需要的朋友参考一下 html字符串是指'<div id=”a”>aklsdjfklsjdfl</div>'这样的带html特殊符号的字符串,我们通常要对他进行处理再输出以免输出成了真正的html元素,也就是把<变成&lt;这样的html符号代码。

  • 我有一个输入表单,允许某人键入unicode字符。所以它可能是类似于“嘿,uF32A怎么了?如果我得到这个字符串,它将有一个子字符串“\uF32A”,我如何将其转换为字符“\uF32A”?

  • 本文向大家介绍C语言宏是简单的字符串替换,包括了C语言宏是简单的字符串替换的使用技巧和注意事项,需要的朋友参考一下 示例 宏是简单的字符串替换。(严格来说,它们使用预处理令牌,而不是任意字符串。) 您可能希望此代码可以打印9(3*3),但实际上5会被打印,因为宏将扩展为1+2*1+2。 您应该将参数和整个宏表达式括在括号中,以避免出现此问题。 另一个问题是,不能保证对宏的参数进行一次评估。它们可能

  • 我有一个嵌套的JSON语句,我需要将其转换为触发数据框。这个JSON语句存在于数据框列中。我一直在尝试使用“from_json”和“get_json_object”解析数据框列中的语句,但无法读取数据。这是我一直试图阅读的源数据的最小片段: 我需要提取嵌套的cript值。我使用下面的代码来清理数据并将其读入数据框 每次运行上述代码时,我都会得到一个空数据框。请帮忙。 尝试了以下内容,但没有成功:P