如何将EBNF语法转换为Javacc?

时间:2015-01-25 10:56:38

标签: javacc

我想为多表示法(前缀,中缀和后缀)算术语言实现解释器。其在EBNF中的语法描述如下。我怎样才能在Javacc中编写代码?

< Process> --> PROCESS  id ; <First Section> <SecondSection>
<First Section> --> VARIABLES [<Variable List>];
<First List> --> <First Def> | <First Def>, <First List>
<First Def> --> <First Name> [ EQUAL integer_literal ]
<First Name> --> id

<Second Section> --> COMMANDS {<Statement>;}
<Statement> --> <Input Statement> | <Output Statement> | <Assignment Statement>

<Input Statement> --> READ 'message ' <First Name>
<Output Statement> --> WRITE 'message ' [ <Expression>]
<Assignment Statement> --> <First Name> <-- <Expression>

<Expression> --> <PrefixExp> | <InfixExp> | <PostfixExp>

<InfixExp> --> <Term> | <InfixExp> (PLUS | MINUS) <Term>
<Term> --> <Factor> | <Term> (MULTIPLICATION | DIVISION) <Factor>
<Factor> --> integer_literal | <First Name> | ( <InfixExp> )

<PrefixExp> --> <Operator> <PrefixExp> <PrefixExp>
<PrefixExp> --> integer_literal | <First Name>

<PostfixExp> --> <PostfixExp> <PostfixExp> <Operator>
<PostfixExp> --> integer_literal | <First Name>

<Operator> --> (ADD | SUBSTRACT | MULTIPLY | DIVIDE)

2 个答案:

答案 0 :(得分:1)

不要这样做!你的语法虽然模糊不清。首先将EBNF格式的语法重写为明确的非左递归形式。完成后,它就可以转换为JavaCC了。

例如,考虑一个命令

write 'hello' 1

是1前缀表达式,后缀表达式还是中缀表达式?你的语法允许所有三种解释。

答案 1 :(得分:0)

首先:

  • 阅读JavaCC FAQ
  • 浏览现有的JavaCC Grammars herehere
  • 拿一个并尝试逐步建立你的语法。