如何将 EBNF 语法转换为 Javacc?
How can I convert an EBNF grammar to 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)
初学者:
- 阅读JavaCC FAQ。
- 浏览现有的 JavaCC 语法 here or here。
- 拿一个并尝试以此为基础逐步构建你的语法。
别这样!就目前而言,您的语法含糊不清。首先将 EBNF 形式的文法重写为明确且非左递归形式。完成后,它就可以转换为 JavaCC。
例如,考虑一个命令
write 'hello' 1
1 是前缀表达式、后缀表达式还是中缀表达式?您的语法允许所有三种解释。
我想为多符号(前缀、中缀和后缀)算术语言实现解释器。下面给出其在 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)
初学者:
- 阅读JavaCC FAQ。
- 浏览现有的 JavaCC 语法 here or here。
- 拿一个并尝试以此为基础逐步构建你的语法。
别这样!就目前而言,您的语法含糊不清。首先将 EBNF 形式的文法重写为明确且非左递归形式。完成后,它就可以转换为 JavaCC。
例如,考虑一个命令
write 'hello' 1
1 是前缀表达式、后缀表达式还是中缀表达式?您的语法允许所有三种解释。