我不确定我是否将 EBNF 翻译成正确的代码,所以如果有人可以看看其中一种我很难做到的方法,那就太好了。
这是 EBNF 语法:
program ::= P {declare} B {statemt} ;
declare ::= ident {, ident} : V ;
statemt ::= assnmt | ifstmt | doloop | read | output
assnmt ::= ident ~ exprsn ;
ifstmt ::= I comprsn @ {statemt} [% {statemt}] &
doloop ::= D {statemt} U comprsn T
read ::= R ident {, ident } ;
output ::= O ident {, ident } ;
comprsn ::= ( oprnd opratr oprnd )
exprsn ::= factor {+ factor}
factor ::= oprnd {* oprnd}
oprnd ::= integer | ident | ( exprsn )
opratr ::= < | = | > | !
ident ::= letter {char}
char ::= letter | digit
integer ::= digit {digit}
letter ::= X | Y | Z
digit ::= 0 | 1
token 是:P B ; , : V ~ I @% & D U T R O ( ) + * <=> ! X Y Z 0 1
private void statemt(){
if((token() == 'X') || (token() == 'Y') || (token() == 'Z')){
assnmt();
}else if(token() == 'I'){
ifstmt();
}else if(token() == 'D'){
doloop();
}else if(token() == 'R'){
read();
}else if(token() == 'O'){
output();
}
}
这是 if stmt 方法正确吗?
private void ifstmt(){
match('I');
comprsn();
match('@');
while((token() == 'X') || (token() == 'Y') || (token() == 'Z')){
statemt();
}
if(token() == '%'){
match('%');
statemt();
}
match('&');
}
最佳答案
最好先测试以关键字开头的语句,然后如果没有关键字匹配则落入赋值大小写。这样您就不需要 X、Y、Z 作为关键字:
private void statemt(){
if(token() == 'I'){
ifstmt();
}else if(token() == 'D'){
doloop();
}else if(token() == 'R'){
read();
}else if(token() == 'O'){
output();
} else {
assnmt();
}
}
在当今时代和语言中,我看不出有任何理由使用这些缩写词。
要回答有关 if
语句的问题:
private void ifstatement() {
match('I');
comprsn();
match('@');
statement();
if (token() == '%') {
statement();
}
if (token() != '&') {
syntax_error("'&' expected");
}
}
要回答关于 {
语句 ... }
的第二个扩展,这在语法中表示为
statement ::= '{' statement ... '}'
这是在 statement()
中实现的,因此:
private void statement(){
if (token == '{') {
do {
statement();
} while (token() != '}');
} else if(token() == 'I'){
ifstmt();
}else if(token() == 'D'){
doloop();
}else if(token() == 'R'){
read();
}else if(token() == 'O'){
output();
} else {
assnmt();
}
}
请注意,我完全忽略了 token 何时被消耗的问题,因为您还没有告诉我们您的 token()
和 match()
方法是如何工作的.
关于java - 这种 EBNF 方法是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22338962/