我不确定我是否正确地将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令牌是:P;,:v~i@%&D U()+*<=>!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();
}
}如果stmt方法正确的话,这是吗?
private void ifstmt(){
match('I');
comprsn();
match('@');
while((token() == 'X') || (token() == 'Y') || (token() == 'Z')){
statemt();
}
if(token() == '%'){
match('%');
statemt();
}
match('&');
}发布于 2014-03-12 00:35:20
最好先测试以关键字开头的语句,然后在没有匹配关键字的情况下进入赋值情况。这样您就不需要将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()和match()方法是如何工作的。
https://stackoverflow.com/questions/22338962
复制相似问题