{"id":18818959,"url":"https://github.com/imagemlt/imagemltlex","last_synced_at":"2025-06-18T11:39:26.907Z","repository":{"id":201349551,"uuid":"163712478","full_name":"imagemlt/ImagemltLex","owner":"imagemlt","description":"编译原理实验 词法分析器lex","archived":false,"fork":false,"pushed_at":"2019-01-13T20:03:46.000Z","size":36,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-05-22T07:55:32.436Z","etag":null,"topics":["compiler","lex"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/imagemlt.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-01-01T04:13:01.000Z","updated_at":"2022-04-06T02:07:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"f4a2a8f0-7943-47be-b026-97feb11bb4b0","html_url":"https://github.com/imagemlt/ImagemltLex","commit_stats":null,"previous_names":["imagemlt/imagemltlex"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/imagemlt/ImagemltLex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imagemlt%2FImagemltLex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imagemlt%2FImagemltLex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imagemlt%2FImagemltLex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imagemlt%2FImagemltLex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imagemlt","download_url":"https://codeload.github.com/imagemlt/ImagemltLex/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imagemlt%2FImagemltLex/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260546203,"owners_count":23025896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compiler","lex"],"created_at":"2024-11-08T00:19:36.968Z","updated_at":"2025-06-18T11:39:21.893Z","avatar_url":"https://github.com/imagemlt.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ImagemltLex\n\n### 实验1 词法分析器lex\n\n\n#### 实验目的:\n\n* Scanner生成器：根据lex文件生成对应的状态转换图，生成扫描器`Scanner.java`\n\n* Scanner.java: 根据输入的程序串，输出对应的token序列。\n\n#### 实现的思路：\n\n* 正则表达式转NFA，NFA转换为DFA,DFA化简后生成状态转移表。\n\n#### 一个案例\n\n* 输入的lex文件:\n\n* ```\n  ( \\(\n  ) \\)\n  ASS =\n  ; ;\n  { {\n  } }\n  COMMA ,\n  IF if\n  ELSE else\n  RETURN return\n  TYPE (int)|(float)|(boolean)\n  ID [a-zA-Z][a-zA-Z0-9]*\n  DIGITS \\d+\n  arithmetic_op \\+|-|\\*|/\n  logical_op (\u0026\u0026)|(==)|(\\|\\|)|([\u0026|\u003e\u003c])\n  %%\n  \tprivate HashSet\u003cCharacter\u003e symbols=new HashSet\u003c\u003e(\n  \t\tArrays.asList(new Character[]{\n  \t\t\t'(',')',',','=','+','-','*','/',';','{','}','\u0026','|','\u003e','\u003c'\n  \t\t})\n  \t);\n  \tprivate String[] matchTable={\"(,%s\",\"),%s\",\"ASS,%s\",\";,%s\",\"{,%s\",\"},%s\",\"COMMA,%s\",\"IF,%s\",\"ELSE,%s\",\"RETURN,%s\",\"TYPE,%s\",\"ID,%s\",\"DIGITS,%s\",\"arithmetic_op,%s\",\"logical_op,%s\",};\n  \n  %%\n   public static void main(String args[]){\n              try {\n                  Scanner scanner=new Scanner(true);\n                  Vector\u003cPair\u003cInteger,String\u003e\u003e tokens=scanner.Scan(new FileReader(\"/tmp/Source.c\"));\n                  BufferedWriter writer=new BufferedWriter(new FileWriter(\"/tmp/tokens\"));\n                  for(Pair\u003cInteger,String\u003etoken:tokens){\n                      writer.write(String.format(scanner.matchTable[scanner.stateIds[token.getKey()]],token.getValue())+\"\\n\");\n                  }\n                  writer.flush();\n                  writer.close();\n              }\n              catch(Exception e){\n                  e.printStackTrace();\n              }\n          }\n  \n  ```\n\n  * 运行`java -jar ImagemltLex.jar /tmp/lex /tmp/Scannner.java`生成的Scanner如下：\n\n* ```java\n  import javafx.util.Pair;\n  \n  import java.io.BufferedReader;\n  import java.io.*;\n  import java.util.*;\n  \n  \n  public class Scanner {\n      public enum STATUS {\n          START,\n          END,\n          NORMAL,\n          BOTH\n      };\n  STATUS[] status={\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.START,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  \tSTATUS.END,\n  };\n  int[] stateIds={\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t11,\n  \t12,\n  \t8,\n  \t9,\n  \t6,\n  \t14,\n  \t14,\n  \t14,\n  \t13,\n  \t-1,\n  \t10,\n  \t1,\n  \t2,\n  \t0,\n  \t4,\n  \t7,\n  \t5,\n  \t3,\n  };\n  int[][] transitionTable={\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,34,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,20,20,20,20,20,20,20,20,20,20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,26,-1,32,30,27,27,23,27,-1,27,20,20,20,20,20,20,20,20,20,20,-1,36,24,31,24,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,1,0,0,10,6,0,0,16,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,33,25,35,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  \t{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,},\n  };\n  int start=28;\n  \tprivate HashSet\u003cCharacter\u003e symbols=new HashSet\u003c\u003e(\n  \t\tArrays.asList(new Character[]{\n  \t\t\t'(',')',',','=','+','-','*','/',';','{','}','\u0026','|','\u003e','\u003c'\n  \t\t})\n  \t);\n  \tprivate String[] matchTable={\"(,%s\",\"),%s\",\"ASS,%s\",\";,%s\",\"{,%s\",\"},%s\",\"COMMA,%s\",\"IF,%s\",\"ELSE,%s\",\"RETURN,%s\",\"TYPE,%s\",\"ID,%s\",\"DIGITS,%s\",\"arithmetic_op,%s\",\"logical_op,%s\",};\n  \n     public Vector\u003cPair\u003cInteger,String\u003e\u003e Scan(String example) throws Exception{\n         int begin=0,end=0;\n         Vector\u003cPair\u003cInteger,String\u003e\u003e ans=new Vector\u003c\u003e();\n         if(example.length()==0)return ans;\n         while(true){\n             String subPattern=\"\";\n             int state=-1;\n  \n             if(symbols.contains(example.charAt(begin))){\n                 end=begin;\n                 while(end\u003cexample.length()\u0026\u0026symbols.contains(example.charAt(end))) {\n                     end=end+1;\n                     subPattern=example.substring(begin,end);\n                     int cuState=match(subPattern);\n                     if(cuState!=-1){\n                         state=cuState;\n                     }\n                     else{\n                         end--;\n                         subPattern=subPattern.substring(0,subPattern.length()-1);\n                         break;\n                     }\n                 }\n                 if(state==-1)\n                     throw new Exception(\"invalid token '\"+subPattern+\"'\");\n  \n             }\n             else if(begin\u003cexample.length() \u0026\u0026 (example.charAt(begin)==' ' || example.charAt(begin)=='\\t')){\n                 while(begin\u003cexample.length() \u0026\u0026 (example.charAt(begin)==' ' || example.charAt(begin)=='\\t'))begin++;\n                 if(begin==example.length())break;\n                 end=begin-1;\n                 continue;\n             }\n             else {\n                 for (end = begin; end \u003c example.length() \u0026\u0026 (example.charAt(end) != ' ' || example.charAt(begin)=='\\t') \u0026\u0026 !symbols.contains(example.charAt(end)); end++);\n                 subPattern=example.substring(begin,end);\n                 state=match(subPattern);\n                 if(state==-1)\n                     throw new Exception(\"invalid token '\"+subPattern+\"'\");\n             }\n             if(state!=-1) {\n                 ans.add(new Pair\u003cInteger, String\u003e(state,subPattern));\n                 if (debug)\n                     System.out.printf(matchTable[stateIds[state]] + \"\\t%s\\n\", subPattern, subPattern);\n             }\n             if(end==example.length()){\n                 break;\n             }\n             if(symbols.contains(example.charAt(end)) ||symbols.contains(example.charAt(begin)))begin=end;\n             else begin=end+1;\n  \n         }\n         return ans;\n      }\n  \n  \n  \n      public Vector\u003cPair\u003cInteger,String\u003e\u003e Scan(Reader reader) throws Exception{\n          BufferedReader bufferedReader=new BufferedReader(reader);\n          Vector\u003cPair\u003cInteger,String\u003e\u003eans=new Vector\u003c\u003e();\n          String line=null;\n          while((line=bufferedReader.readLine())!=null){\n              Vector\u003cPair\u003cInteger,String\u003e\u003e tmp=Scan(line);\n              ans.addAll(tmp);\n          }\n          return ans;\n      }\n  \n      public Vector\u003cPair\u003cInteger,String\u003e\u003e Scan(InputStream stream) throws Exception{\n          return Scan(new InputStreamReader(stream));\n      }\n  private int match(String input){\n          Pair\u003cInteger,Integer\u003e tmp;\n          boolean end=false;\n          Integer matchState=-1;\n          Stack\u003cPair\u003cInteger,Integer\u003e\u003e matchStack=new Stack\u003c\u003e();\n  \n          Integer nextMatch=transitionTable[this.start][(int)input.charAt(0)];\n          if(nextMatch!=-1){\n              matchStack.push(new Pair\u003cInteger,Integer\u003e(nextMatch,1));\n          }\n  \n          while(!matchStack.empty()){\n              tmp=matchStack.pop();\n              /*if(tmp.getKey().getStatus()== State.STATUS.BOTH || tmp.getKey().getStatus()== State.STATUS.END){\n                  end=true;\n              }*/\n              if(tmp.getValue()==input.length()){\n                  if(status[tmp.getKey()]==STATUS.BOTH || status[tmp.getKey()]== STATUS.END){\n                      matchState=tmp.getKey();\n                      break;\n                  }\n              }\n              else {\n                  char nextChar = input.charAt(tmp.getValue());\n                  nextMatch=transitionTable[tmp.getKey()][(int)nextChar];\n                  if(nextMatch!=-1){\n                      matchStack.push(new Pair\u003cInteger, Integer\u003e(nextMatch,tmp.getValue()+1));\n                  }\n              }\n  \n          }\n          return matchState;\n      }\n  private boolean debug=false;\n      public Scanner(boolean debug) {\n          this.debug=debug;\n      }\n   public static void main(String args[]){\n              try {\n                  Scanner scanner=new Scanner(true);\n                  Vector\u003cPair\u003cInteger,String\u003e\u003e tokens=scanner.Scan(new FileReader(\"/tmp/Source.c\"));\n                  BufferedWriter writer=new BufferedWriter(new FileWriter(\"/tmp/tokens\"));\n                  for(Pair\u003cInteger,String\u003etoken:tokens){\n                      writer.write(String.format(scanner.matchTable[scanner.stateIds[token.getKey()]],token.getValue())+\"\\n\");\n                  }\n                  writer.flush();\n                  writer.close();\n              }\n              catch(Exception e){\n                  e.printStackTrace();\n              }\n          }\n  \n  }\n  \n  ```\n\n  * 该scanner读取/tmp/Source.c文件的内容，并把读取到的token序列输出到/tmp/tokens文件中。\n  * 运行`javac Scanner.java`,`java Scanner`后得到的token序列`/tmp/tokens`:\n\n* ```\n  TYPE,float\n  ID,func\n  (,(\n  TYPE,int\n  ID,m\n  COMMA,,\n  TYPE,int\n  ID,n\n  ),)\n  {,{\n  RETURN,return\n  ID,m\n  arithmetic_op,+\n  ID,n\n  ;,;\n  },}\n  TYPE,int\n  ID,main\n  (,(\n  ),)\n  {,{\n  TYPE,int\n  ID,a\n  COMMA,,\n  ID,b\n  ;,;\n  ID,a\n  ASS,=\n  DIGITS,0\n  ;,;\n  IF,if\n  (,(\n  ID,a\n  logical_op,\u003e\n  DIGITS,0\n  ),)\n  {,{\n  ID,a\n  ASS,=\n  ID,func\n  (,(\n  ID,a\n  COMMA,,\n  ID,b\n  ),)\n  ;,;\n  },}\n  ELSE,else\n  {,{\n  ID,a\n  ASS,=\n  DIGITS,5\n  ;,;\n  },}\n  RETURN,return\n  DIGITS,1\n  ;,;\n  },}\n  \n  ```\n\n  #### 核心算法描述：\n\n  * 项目的结构\n    * DFA类：描述DFA\n    * NFA类：描述NFA\n    * Edge类：自动机中的每一个转换\n    * State类：自动机中的每一个状态\n    * io包中的两个类主要用于读取lex文件并提取正则表达式、输出Scanner的代码\n\n  * 相关算法\n\n    * `class NFA`\n\n      * `public static NFA Reg2NFA(String regExp)`\n\n        * 将正则表达式转换为对应的NFA\n        * 使用栈(Stack)来辅助匹配括号、匹配`|`号\n\n      * `public void star()`\n\n        * 表示NFA的`*`运算\n\n      * `public void or(NFA nfa2)`\n\n        * 表示对`A|B`的运算\n\n      * `public void cat(NFA nfa2)`\n\n        * 表示`AB`的运算\n\n      * `public void keepEnd_or(NFA nfa2)`\n\n        * 保持结束符的A|B运算\n    * `class DFA`\n      * `public HashSet\u003cState\u003e getClosure(State state)`\n        * 获取某个状态的闭包\n      * `public HashSet\u003cState\u003e getTransClosure(HashSet\u003cState\u003e state,Character character)`\n        * 获取转移闭包函数\n      * `private HashSet\u003cState\u003e move(State state,Character c,Vector\u003cHashSet\u003cState\u003e\u003e vect)`\n        * move函数 DFA简化中使用\n      * `public HashMap\u003cHashSet\u003cState\u003e, HashMap\u003cCharacter,HashSet\u003cState\u003e\u003e\u003e getTransitionTable(NFA nfa)`\n        * 根据NFA生成DFA状态转换表，实现NFA转DFA的主要函数\n      * `public DFA(NFA nfa)`\n        * 构造函数，将NFA转化为对应的DFA\n      * `public void simplization()`\n        * DFA简化算法\n    * 生成的`Scanner`\n      * `public Vector\u003cPair\u003cInteger,String\u003e\u003e Scan(String example) throws Exception`\n\n        * 根据转换表进行扫描的函数实现，且加入了错误处理，当某个token不能被识别时将会抛出异常。\n\n#### 程序开发中遇到的一些问题以及解决方法\n\n* 运行效率低的问题：\n  * 加入了几个用于标记的HashMap，从而避免了一些重复运算\n  * HashSet的应用将许多细节算法的复杂度由$$O(n)$$ 降低到了$$O(log(n))$$ ,最开始的一版在处理某个比较长的正则时需要10分钟，优化后只需要不到1分钟。\n\n####  感受：\n\n* RE转NFA转化DFA再最小化是难度最高的一个实现方式，在实现这个算法中巩固了词法分析方面的知识，并且巩固了java编程的一些技巧，以及java中的集合类的应用。\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimagemlt%2Fimagemltlex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimagemlt%2Fimagemltlex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimagemlt%2Fimagemltlex/lists"}