Java 伪编程语言的正则表达式

Java 伪编程语言的正则表达式,java,regex,tokenize,lexical-analysis,Java,Regex,Tokenize,Lexical Analysis,我的任务是创建一个词法分析器,将语言翻译成一系列标记。我使用java.util.regex遍历一个字符串,查找不同的令牌,并将它们放入一个数组中,我将遍历该数组并使用该数组为它们分配各自的令牌。以下是我计划的一部分: public static void main(String args[]) throws FileNotFoundException, IOException{ String[] symbols = {"+","-","*","/","<","<="

我的任务是创建一个词法分析器,将语言翻译成一系列标记。我使用java.util.regex遍历一个字符串,查找不同的令牌,并将它们放入一个数组中,我将遍历该数组并使用该数组为它们分配各自的令牌。以下是我计划的一部分:

public static void main(String args[]) throws FileNotFoundException, IOException{

        String[] symbols = {"+","-","*","/","<","<=",">",">=","==","!=","=",";",",",".","(",")","[","]","{","}","/*","*/","//"};
        String[] input;
        FileInputStream fstream = new FileInputStream("src\\testCode.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        StringBuilder sb = new StringBuilder();
        String s;
        String ret = "";
        while((s = br.readLine()) != null){
            sb.append(s);
        }

        ret = sb.toString();

        input = regexChecker("regex goes here",ret);

        for (int i = 0; i < input.length; i++) {
            System.out.println(input[i]);

        }
        System.out.println(input.length);
        in.close();       
    }  

public static String[] regexChecker(String theRegex, String str2Check){
         List<String> allMatches = new ArrayList<String>();
        Pattern checkRegex = Pattern.compile(theRegex);
        Matcher regexMatcher = checkRegex.matcher(str2Check);

        while(regexMatcher.find()){
            //regexInput = new String[regexMatcher.group().length()];
            allMatches.add(regexMatcher.group());
        }
        String[] regexInput = allMatches.toArray(new String[allMatches.size()]);

        return regexInput;
    }
publicstaticvoidmain(字符串args[])抛出FileNotFoundException、IOException{
字符串[]符号={“+”、“-”、“*”、“/”、“=”、“=”、“!=”、“=”、“;”、“、”、“(“、”)、“[”、“]”、“{”、“}”、“/*”、“*/”、“/”};
字符串[]输入;
FileInputStream fstream=新的FileInputStream(“src\\testCode.txt”);
BufferedReader br=新的BufferedReader(新的InputStreamReader(fstream));
StringBuilder sb=新的StringBuilder();
字符串s;
字符串ret=“”;
而((s=br.readLine())!=null){
某人追加;
}
ret=sb.toString();
输入=regexChecker(“regex在这里”,ret);
for(int i=0;i
我的问题是:有没有一个正则表达式可以把这种语言分开?或者我的作业完全错了,只使用了一个正则表达式?一些词汇约定是:标识符以大写字母或小写字母或下划线开头,后跟任何单词字符。允许使用注释行和注释块。数字是十进制表示法中的无符号整数或实数。还有int、double、if等关键字和*、/、+等特殊符号

我可以为每个单独的约定生成正则表达式,但我不知道如何按照我的程序要求将它们组合成1


另外,我正在使用
(?:/.*)(/\\*(?:.\[\\n\\r])*?\\*/)作为注释的正则表达式,但它似乎不适用于注释行,只适用于注释块。将文件读入一行字符串的方式可能是原因吗?

我建议下载。它是一个很小的解析器生成器,支持类似于EBNF(Extended Backus Naur Form)的语法语言。它适用于C#/VB,但是基本语法定义应该教会您很多关于解析器的知识。如果您了解C#或VB,您可以检查生成的解析器,了解创建自己的解析器的一些想法。

您可能能够使用,但在许多情况下,这不够灵活

当然,您可以编写自己的标记器。这并不像听起来那么难,一旦你自己做了。有些人会告诉你,你应该使用一个工具/库来代替,但我认为大多数人这样做是因为他们在学校就这样学的,并且在编写/维护标记器和解析器方面没有实际的实际经验。例如,有相当多的开源手写标记器和解析器