首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个EBNF方法正确吗?

这个EBNF方法正确吗?
EN

Stack Overflow用户
提问于 2014-03-11 23:33:29
回答 1查看 1K关注 0票数 2

我不确定我是否正确地将EBNF转换成代码,所以如果有人能看一看我很难做的方法之一,那就太好了。

以下是EBNF语法:

代码语言:javascript
复制
   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

代码语言:javascript
复制
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方法正确的话,这是吗?

代码语言:javascript
复制
   private void ifstmt(){
     match('I');
     comprsn();
     match('@');
     while((token() == 'X') || (token() == 'Y') || (token() == 'Z')){
       statemt();
     }
     if(token() == '%'){
         match('%');
         statemt();
     }
     match('&');
   }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-12 00:35:20

最好先测试以关键字开头的语句,然后在没有匹配关键字的情况下进入赋值情况。这样您就不需要将X、Y、Z作为关键字:

代码语言:javascript
复制
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语句的问题:

代码语言:javascript
复制
private void ifstatement() {
    match('I');
    comprsn();
    match('@');
    statement();
    if (token() == '%') {
        statement();
    }
    if (token() != '&') {
        syntax_error("'&' expected");
    }
}

要回答关于{语句. }的第二个扩展,这是在语法中表示的

代码语言:javascript
复制
statement ::= '{' statement ... '}'

这在statement()中实现,因此:

代码语言:javascript
复制
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()方法是如何工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22338962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档