我试图想出一个简单的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')+
;
答案 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
。
每个案例的分析:
a
1.1。 term
(1)
(a)
2.1。 term
(2)
2.2。 alt_term
(1)
2.3。 app_term
(1)
(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)
(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)
(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)
(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)