微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我想知道这个词法分析代码有什么错误

如何解决我想知道这个词法分析代码有什么错误

import 'dart:io';
import 'package:validated/validated.dart';

enum Token  {Identifier,Constant,Operator,Keyword,Error}
void main() async {
  var f = new File('data.txt');
  var fdata ;
  if(await f.exists()){
    fdata= await f.readAsstring();
  }
  bool isCharacter(var str){
    if(str=='a' || str=='A'||str=='b' || str=='B'||str=='c' || str=='C'||str=='d' || str=='D'||str=='e' || str=='E'||str=='f' || str=='F'
        ||str=='g' || str=='G'||str=='h' || str=='H'||str=='i' || str=='I'||str=='j' || str=='J'||str=='k' || str=='K'||str=='l' || str=='L'
        ||str=='m' || str=='M'||str=='o' || str=='O'||str=='p' || str=='P'||str=='q' || str=='Q'||str=='r' || str=='R'||str=='s' || str=='S'
        ||str=='t' || str=='T'||str=='u' || str=='U'||str=='v' || str=='V'||str=='w' || str=='W'||str=='x' || str=='X'||str=='y' || str=='Y'
        ||str=='z' || str=='Z')
      return true;
    else
      return false;
  }
  bool isNumber(String str)                         //check if the given substring is a number or not
  {
    int i,len = str.length,numOfDecimal = 0;
    if (len == 0)
    {
      return false;
    }
    for (i = 0; i < len; i++)
    {
      if ((numOfDecimal >= 0 && str[i] == '.') || (str[i] == '.' && numOfDecimal >= 0)) //numOfDecimal > 1 this means it must pass on number 1
          {
        return true;
      }
      else if (numOfDecimal < 0)
      {
        numOfDecimaL++;
      }
      if (str[i] != '0' && str[i] != '1' && str[i] != '2'
          && str[i] != '3' && str[i] != '4' && str[i] != '5'
          && str[i] != '6' && str[i] != '7' && str[i] != '8'
          && str[i] != '9' )
      {
        return false;
      }
    }
    return true;
  }

  bool isConstant(var str){
    if(isNumber(str))
      return true;
    else if(str[0]=='"' && str.length-1=='"')
      return true;
    else if(str[0]=='\'' && str.length-1=='\'')
      return true;
    else
      return false;
  }
  bool isOperator(var ch)                   //check if the given character is a punctuator or not
  {
    if (ch == ':' || ch == ',' || ch == ';' ||  ch == '(' || ch == ')' ||
        ch == '[' || ch == ']' || ch == '{' || ch == '}'  || ch == '//' ||
        ch == '#' || ch == ',' ||ch == '+' || ch == '-' || ch == '*' ||
        ch == '/' || ch == '>' || ch == '<' || ch == '=' || ch == '|' || ch == '&' ||
        ch == '%' ||ch == '\$')
    {
      return true;
    }
    else
      return false;
  }
  bool isIdentifier( var str)                       //check if the given identifier is valid or not
  {
    if (str[0] == '0' || str[0] == '1' || str[0] == '2' ||
        str[0] == '3' || str[0] == '4' || str[0] == '5' ||
        str[0] == '6' || str[0] == '7' || str[0] == '8' ||
        str[0] == '9' || isOperator(str[0]) == true)
    {
      return false;
    }                                   //if first character of string is a digit or a special character,identifier is not valid
    int i,len = str.length;/*The strlen() function returns the length of the null terminated byte string.
 It takes a null terminated byte string str as its argument and returns its length.The length does not include the null character.
 If there is no null character in the string,the behavIoUr of the function is undefined.*/
    if (len == 1)
    {
      return true;
    }                                       //if length is one,validation is already completed,hence return true
    else
    {
      for (i = 1; i < len; i++)                     //identifier cannot contain special characters
          {
        if (isOperator(str[i]) == true)
        {
          return false;
        }
      }
    }
    return true;
  }
  bool isKeyword(String str){
    if (str == "if" || str == "else" || str == "while" || str == "do" || str == "break" || str == "continue" || str == "int"
        || str == "double" || str == "float" || str == "return" || str == "char" || str == "case" || str == "long" || str == "short"
        || str == "typedef" || str == "switch" || str == "unsigned" || str == "void" || str == "static" || str == "struct" || str == "sizeof"
        || str == "long" || str == "volatile" || str == "enum" || str == "const" || str == "union" || str == "extern" || str == "bool"
        || str == "alignas" || str == "alignof" || str == "and" || str == "and_eq" || str == "asm" || str == "atomic_cancel" || str == "atomic_commit"
        || str == "atomic_noexcept" || str == "auto" || str == "bitor" || str == "bitand" || str == "catch" || str == "char16_t" || str == "char32_t"
        ||str == "class" || str == "compl" || str == "concept" || str == "constexpr" || str == "const_cast" || str == "co_await" || str == "co_return"
        || str == "co_yield" || str == "bool" || str == "decltype" || str == "default" || str == "delete" || str == "double"  || str == "dynamic_cast"
        || str == "else" || str == "if" || str == "explicit" || str == "export" || str == "implements" || str == "false" || str == "float" || str == "for"
        || str == "friend" || str == "goto" || str == "import" || str == "inline" || str == "module" || str == "mutable" || str == "namespace" || str == "new"
        || str == "noexcept" || str == "not" || str == "not_eq" || str == "nullptr" || str == "operator" || str == "or" || str == "or_eq" || str == "private"
        || str == "protected" || str == "public" || str == "register" || str == "reinterpret_cast" || str == "requires" || str == "return" || str == "short"
        || str == "signed" || str == "static" || str == "static_assert" || str == "static_cast" || str == "synchronized" || str == "template"
        ||str == "this" || str == "thread_local")

      return true;
    else
      return false;
  }
  Token read_token(var token) {
    String s;
    var ch;
    for(int i=0; i<token.length; i++) {
      ch = token[i];
    }
    print(ch);
   // fdata >> ch;
    while(ch==' ') fdata.trim();
    if (token == '#' || token == ':' || token == ',' || token == ';' || token == '(' ||
        token == ')' || token == '[' || token == ']' || token == '{' || token == '}'
        || token == '//' || token == '#' || token == ',' || token == '+' || token == '-' ||
        token == '*' || token == '/' || token == '>' || token == '<' || token == '=' || token == '|' || token == '&'
        || token == '%' || token == '\$')
      print("Operator");
    else if (token == '<') {
      fdata.readAsBytes(ch);
      if (token == '=' || token == '>' || token == '<')
        print("Operator");
      else
        print("Error");
    }
    else if (token == '>') {
      fdata.readAsBytes(ch);
      if (token == '=' || token == '>')
         print("Operator");
      else
        print("Error");

    }
    else if (isCharacter(ch)) {
      s = ch; fdata.readAsBytes(ch);
      while (isNumber(ch)) {
        s += ch;
      }
      //fdata.putback(ch);
      print(isKeyword(s));
    }
    else {
      if (isNumber(ch)){
        s=ch; fdata.readAsBytes(ch);
        while(isAlphanumeric(ch)){
          s+=ch; fdata.readAsBytes(ch);
        }
        //fdata.putback(ch);
        print("Constant");
      }
      else print("Error");
    }
  }
  String Scan(var str) {
    Token strng = read_token(str);
    switch (strng) {
      case Token.Keyword:
        {
          print("if");
        }
        break;
      case Token.Keyword:
        {
          print("else");
        }
        break;
      case Token.Keyword:
        {
          print("alignas");
        }
        break;
      case Token.Keyword:
        {
          print("alignof");
        }
        break;
      case Token.Keyword:
        {
          print("and");
        }
        break;
      case Token.Keyword:
        {
          print("and_eq");
        }
        break;
      case Token.Keyword:
        {
          print("asm");
        }
        break;
      case Token.Keyword:
        {
          print("atomic_cancel");
        }
        break;
      case Token.Keyword:
        {
          print("if");
        }
        break;
      case Token.Keyword:
        {
          print("atomic_commit");
        }
        break;
      case Token.Keyword:
        {
          print("atomic_noexcept");
        }
        break;
      case Token.Keyword:
        {
          print("auto");
        }
        break;
      case Token.Keyword:
        {
          print("bitand");
        }
        break;
      case Token.Keyword:
        {
          print("bitor");
        }
        break;
      case Token.Keyword:
        {
          print("bool");
        }
        break;
      case Token.Keyword:
        {
          print("break");
        }
        break;
      case Token.Keyword:
        {
          print("case");
        }
        break;
      case Token.Keyword:
        {
          print("catch");
        }
        break;
      case Token.Keyword:
        {
          print("char");
        }
        break;
      case Token.Keyword:
        {
          print("char16_t");
        }
        break;
      case Token.Keyword:
        {
          print("char32_t");
        }
        break;
      case Token.Keyword:
        {
          print("class");
        }
        break;
      case Token.Keyword:
        {
          print("compl");
        }
        break;
      case Token.Keyword:
        {
          print("concept");
        }
        break;
      case Token.Keyword:
        {
          print("const");
        }
        break;
      case Token.Keyword:
        {
          print("constexpr");
        }
        break;
      case Token.Keyword:
        {
          print("co_await");
        }
        break;
      case Token.Keyword:
        {
          print("continue");
        }
        break;
      case Token.Keyword:
        {
          print("const_cast");
        }
        break;
      case Token.Keyword:
        {
          print("co_return");
        }
        break;
      case Token.Keyword:
        {
          print("co_yield");
        }
        break;
      case Token.Keyword:
        {
          print("decltype");
        }
        break;
      case Token.Keyword:
        {
          print("default");
        }
        break;
      case Token.Keyword:
        {
          print("delete");
        }
        break;
      case Token.Keyword:
        {
          print("do");
        }
        break;
      case Token.Keyword:
        {
          print("double");
        }
        break;
      case Token.Keyword:
        {
          print("dynamic_cast");
        }
        break;
      case Token.Keyword:
        {
          print("enum");
        }
        break;
      case Token.Keyword:
        {
          print("explicit");
        }
        break;
      case Token.Keyword:
        {
          print("export");
        }
        break;
      case Token.Keyword:
        {
          print("extern");
        }
        break;
      case Token.Keyword:
        {
          print("false");
        }
        break;
      case Token.Keyword:
        {
          print("float");
        }
        break;
      case Token.Keyword:
        {
          print("for");
        }
        break;
      case Token.Keyword:
        {
          print("friend");
        }
        break;
      case Token.Keyword:
        {
          print("goto");
        }
        break;
      case Token.Keyword:
        {
          print("int");
        }
        break;
      case Token.Keyword:
        {
          print("if");
        }
        break;
      case Token.Keyword:
        {
          print("long");
        }
        break;
      case Token.Keyword:
        {
          print("module");
        }
        break;
      case Token.Keyword:
        {
          print("mutable");
        }
        break;
      case Token.Keyword:
        {
          print("namespace");
        }
        break;
      case Token.Keyword:
        {
          print("new");
        }
        break;
      case Token.Keyword:
        {
          print("noexcept");
        }
        break;
      case Token.Keyword:
        {
          print("not");
        }
        break;
      case Token.Keyword:
        {
          print("not_eq");
        }
        break;
      case Token.Keyword:
        {
          print("nullptr");
        }
        break;
      case Token.Keyword:
        {
          print("operator");
        }
        break;
      case Token.Keyword:
        {
          print("or");
        }
        break;
      case Token.Keyword:
        {
          print("or_eq");
        }
        break;
      case Token.Keyword:
        {
          print("private");
        }
        break;
      case Token.Keyword:
        {
          print("protected");
        }
        break;
      case Token.Keyword:
        {
          print("public");
        }
        break;
      case Token.Keyword:
        {
          print("register");
        }
        break;
      case Token.Keyword:
        {
          print("reinterpret_cast");
        }
        break;
      case Token.Keyword:
        {
          print("requires");
        }
        break;
      case Token.Keyword:
        {
          print("return");
        }
        break;
      case Token.Keyword:
        {
          print("short");
        }
        break;
      case Token.Keyword:
        {
          print("signed");
        }
        break;
      case Token.Keyword:
        {
          print("sizeof");
        }
        break;
      case Token.Keyword:
        {
          print("static");
        }
        break;
      case Token.Keyword:
        {
          print("static_assert");
        }
        break;
      case Token.Keyword:
        {
          print("static_cast");
        }
        break;
      case Token.Keyword:
        {
          print("struct");
        }
        break;
      case Token.Keyword:
        {
          print("switch");
        }
        break;
      case Token.Keyword:
        {
          print("synchronized");
        }
        break;
      case Token.Keyword:
        {
          print("template");
        }
        break;
      case Token.Keyword:
        {
          print("this");
        }
        break;
      case Token.Keyword:
        {
          print("thread_local");
        }
        break;
      case Token.Keyword:
        {
          print("throw");
        }
        break;
      case Token.Keyword:
        {
          print("typedef");
        }
        break;
      case Token.Keyword:
        {
          print("try");
        }
        break;
      case Token.Keyword:
        {
          print("true");
        }
        break;
      case Token.Keyword:
        {
          print("typeid");
        }
        break;
      case Token.Keyword:
        {
          print("typename");
        }
        break;
      case Token.Keyword:
        {
          print("union");
        }
        break;
      case Token.Keyword:
        {
          print("unsigned");
        }
        break;
      case Token.Keyword:
        {
          print("using");
        }
        break;
      case Token.Keyword:
        {
          print("virtual");
        }
        break;
      case Token.Keyword:
        {
          print("wchar_t");
        }
        break;
      case Token.Keyword:
        {
          print("volatile");
        }
        break;
      case Token.Keyword:
        {
          print("void");
        }
        break;
      case Token.Keyword:
        {
          print("while");
        }
        break;
      case Token.Keyword:
        {
          print("xor");
        }
        break;
      case Token.Keyword:
        {
          print("xor_eq");
        }
        break;

      case Token.Operator:
        {
          print(":");
        }
        break;
      case Token.Operator:
        {
          print(",");
        }
        break;
      case Token.Operator:
        {
          print(";");
        }
        break;
      case Token.Operator:
        {
          print("(");
        }
        break;
      case Token.Operator:
        {
          print(")");
        }
        break;
      case Token.Operator:
        {
          print("[");
        }
        break;
      case Token.Operator:
        {
          print("]");
        }
        break;
      case Token.Operator:
        {
          print("{");
        }
        break;
      case Token.Operator:
        {
          print("}");
        }
        break;
      case Token.Operator:
        {
          print("//");
        }
        break;
      case Token.Operator:
        {
          print("\$");
        }
        break;
      case Token.Operator:
        {
          print("%");
        }
        break;
      case Token.Operator:
        {
          print("&");
        }
        break;
      case Token.Operator:
        {
          print("|");
        }
        break;
      case Token.Operator:
        {
          print("=");
        }
        break;
      case Token.Operator:
        {
          print("<");
        }
        break;
      case Token.Operator:
        {
          print(">");
        }
        break;
      case Token.Operator:
        {
          print("/");
        }
        break;
      case Token.Operator:
        {
          print("*");
        }
        break;
      case Token.Operator:
        {
          print("-");
        }
        break;
      case Token.Operator:
        {
          print("+");
        }
        break;
      case Token.Operator:
        {
          print("#");
        }
        break;
      case Token.Constant:
        {
          print(isNumber(strng.toString()));
        }
        break;
      case Token.Constant:
        {
          print(strng.toString()[0] == '"' && strng.toString().length - 1 == '"');
        }
        break;
      case Token.Constant:
        {
          print(strng.toString()[0] == '\'' && strng.toString().length - 1 == '\'');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '0');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '1');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '2');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '3');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '4');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '5');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '6');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '7');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '8');
        }
        break;
      case Token.Error:
        {
          print(strng.toString()[0] == '9');
        }
        break;
      case Token.Error:
        {
          print(isOperator(strng.toString()[0]) == true);
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'a' || strng.toString()[0] == 'A');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'b' || strng.toString()[0] == 'B');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'c' || strng.toString()[0] == 'C');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'd' || strng.toString()[0] == 'D');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'e' || strng.toString()[0] == 'E');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'f' || strng.toString()[0] == 'F');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'g' || strng.toString()[0] == 'G');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'h' || strng.toString()[0] == 'H');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'i' || strng.toString()[0] == 'I');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'j' || strng.toString()[0] == 'J');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'k' || strng.toString()[0] == 'K');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'l' || strng.toString()[0] == 'L');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'm' || strng.toString()[0] == 'M');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'n' || strng.toString()[0] == 'N');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'o' || strng.toString()[0] == 'O');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'p' || strng.toString()[0] == 'P');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'q' || strng.toString()[0] == 'Q');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'r' || strng.toString()[0] == 'R');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 's' || strng.toString()[0] == 'S');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 't' || strng.toString()[0] == 'T');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'v' || strng.toString()[0] == 'V');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'w' || strng.toString()[0] == 'W');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'x' || strng.toString()[0] == 'X');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'y' || strng.toString()[0] == 'Y');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == 'z' || strng.toString()[0] == 'Z');
        }
        break;
      case Token.Identifier:
        {
          print(strng.toString()[0] == '_');
        }
        break;
    }
  }
  Scan(fdata);
}

/*这是一段关于词法分析的代码,它是编译器的第一阶段。它从以句子形式编写的语言预处理器中获取修改后的源代码。词法分析器通过删除代码中的任何空格或注释将这些语法分解为一系列标记

如果词法分析器发现令牌无效,则会生成错误。词法分析器与语法分析器密切合作。它从源代码读取字符流,检查合法标记,并在需要时将数据传递给语法分析器。错误是当我 当我在文件中编写代码进行词法分析时运行代码编译器只给了我最后一项并说它的类型而不是文件 data.txt 中代码中的全部项目为什么这个错误*/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。