Java 这些表达式的语法分析器

Java 这些表达式的语法分析器,java,antlr,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中),但都有一些例子,这就

我试图提出一个简单的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')+ 
    ;

下面的语法将解析您提供的所有示例

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

对每个案例的分析:

  • a

    1.1<代码>术语(1)

  • (a)

    2.1<代码>术语(2)

    2.2<代码>替换项(1)

    2.3<代码>应用程序术语(1)

  • (a | b | c)

    3.1<代码>术语(2)

    3.2<代码>替换项(2)

    3.3<代码>应用程序术语(1)

    3.4<代码>替换项(2)

    3.5<代码>应用程序术语(1)

    3.6<代码>替换项(1)

    3.7<代码>应用程序术语(1)

  • (a(b | c | d))

    4.1<代码>术语(2)

    4.2<代码>替换项(1)

    4.3<代码>应用程序术语(2)

    4.4<代码>替换项(2)

    4.5<代码>应用程序术语(1)

    4.6<代码>替换项(2)

    4.7<代码>应用程序术语(1)

    4.8<代码>替换项(1)

    4.9<代码>应用程序术语(1)

  • (a(b |(c | d))

    5.1<代码>术语(2)

    5.2<代码>替换项(1)

    5.3<代码>应用程序术语(2)

    5.4<代码>替换项(3)

    5.5<代码>应用程序术语(1)

    5.6<代码>替换项(2)

    5.7<代码>应用程序术语(1)

    5.8<代码>替换项(1)

    5.9<代码>应用程序术语(1)

  • (a(b(c x | d(e | f)))

    6.1<代码>术语(2)

    6.2<代码>替换项(1)

    6.3<代码>应用程序术语(2)

    6.4<代码>替换项(1)

    6.5<代码>应用程序术语(2)

    6.6<代码>替换项(2)

    6.7<代码>应用程序术语(1)

    6.8<代码>替换项(1)

    6.9<代码>应用程序术语(2)

    6.10<代码>替换项(2)

    6.11<代码>应用程序术语(1)

    6.12<代码>替换项(1)

    6.13<代码>应用程序术语(1)


  • 我会看看JavaCC或者已经实现了这一点的工具。您可以阅读他们的文档和源代码,了解他们是如何做到这一点的。
    cx|d(e|f)
    中的预期标记是什么?@PeterLawrey我正在使用Antlr验证我的语法。在这种情况下;问题是什么?@Raffaele很抱歉不清楚,唯一的标记是“(“&”)其余所有字母数字字符。我更新了语法。