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

标签 java parsing ebnf

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

相关文章:

java - 在网络服务器上运行geotools?

javascript - 如何计算从字符串到整数的公式

c++ - 如何从 C# 解析/简单分析 C/C++ 代码以获取方法列表

C 浮点文字 - 在 EBNF 中定义

c# - 将 EBNF 翻译成 Irony

java - 测量无等待多线程 Java 程序中的争用

java - JDBC:UserID作为主键,在Java代码中增加

python - 缩进级别定义 block 的语言语法的 BNF 示例?

java - jsoup 的奇怪编码行为

python - lxml:获取属性值后的字段