这些表达式的解析器语法

时间:2013-12-19 10:03:57

标签: java antlr

我试图想出一个简单的EBNF语法来解析下面的表达式 示例:(“ - >”不是输入的一部分)。 'a','b''c'是多字符单词,仅包含字母。

-> a
-> (a)
-> (a | b | c)
-> (a (b | c | d))
-> (a (b | (c | d)) )
-> (a (
     b (
        c x
      | d (e | f)
      )
    )
  )

我尝试了几个语法(在Antlr中),但是所有这些都在几个案例中破解,这就是我现在所拥有的,任何帮助都会受到赞赏。

term:   '(' WORD+ options_list ')' 
    |   '(' WORD+ ('|' term)* ')'
    |   WORD+
    ;

options_list:   '(' term ('|' term)* ')' 
    ;
}

WORD    :   ('a'..'z')+ 
    ;

编辑1: 基本上我试图从语法中创建一个分层的单词树,例如在最后一种情况下,树看起来像这些

     [a]
      |
     [b]
     / \
 [c,x]  [d]
        /  \
       [e]  [f] 

我不希望依赖Antlr或JavaCC自动生成解析器的原因有多种,我想编写自己的简单递归下降解析器,为了做到这一点我首先想出一个有效的语法这适用于所有情况,那么它就足够简单了。

EDIT2: 在完成一些工作后,我有了这个似乎适用于

term:   WORD term?
    |   '(' term ('|' term)* ')'
    ;


WORD    :   ('a'..'z')+ 
    ;

1 个答案:

答案 0 :(得分:1)

以下语法似乎可以解析您提供的所有示例。

term        : WORD+
            | '(' alt_term ')'
            ;

alt_term    : app_term
            | app_term '|' alt_term
            | app_term '|' '(' alt_term ')'
            ;

app_term    : WORD+
            | WORD+ '(' alt_term ')'
            ;

WORD        : ('a'..'z')+ 
            ;

我在AntlrWorks中对它进行了测试,并解析了所有示例。我刚刚在空白处添加了EOF识别和skip

每个案例的分析:

  1. a

    1.1。 term(1)

  2. (a)

    2.1。 term(2)

    2.2。 alt_term(1)

    2.3。 app_term(1)

  3. (a | b | c)

    3.1。 term(2)

    3.2。 alt_term(2)

    3.3。 app_term(1)

    3.4。 alt_term(2)

    3.5。 app_term(1)

    3.6。 alt_term(1)

    3.7。 app_term(1)

  4. (a (b | c | d))

    4.1。 term(2)

    4.2。 alt_term(1)

    4.3。 app_term(2)

    4.4。 alt_term(2)

    4.5。 app_term(1)

    4.6。 alt_term(2)

    4.7。 app_term(1)

    4.8。 alt_term(1)

    4.9。 app_term(1)

  5. (a (b | (c | d)) )

    5.1。 term(2)

    5.2。 alt_term(1)

    5.3。 app_term(2)

    5.4。 alt_term(3)

    5.5。 app_term(1)

    5.6。 alt_term(2)

    5.7。 app_term(1)

    5.8。 alt_term(1)

    5.9。 app_term(1)

  6. (a (b (c x | d (e | f))))

    6.1。 term(2)

    6.2。 alt_term(1)

    6.3。 app_term(2)

    6.4。 alt_term(1)

    6.5。 app_term(2)

    6.6。 alt_term(2)

    6.7。 app_term(1)

    6.8。 alt_term(1)

    6.9。 app_term(2)

    6.10。 alt_term(2)

    6.11。 app_term(1)

    6.12。 alt_term(1)

    6.13。 app_term(1)