gpt4 book ai didi

java - 这种 EBNF 方法是否正确?

转载 作者:行者123 更新时间:2023-11-30 11:21:12 25 4
gpt4 key购买 nike

我不确定我是否将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com