Java 这些表达式的语法分析器
我试图提出一个简单的EBNF语法来解析下面的表达式 示例:(“->”不是输入的一部分)。'“a”、“b”、“c”是仅包含字母的多字符单词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中),但都有一些例子,这就
-> 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很抱歉不清楚,唯一的标记是“(“&”)其余所有字母数字字符。我更新了语法。