伪编程语言的正则表达式

时间:2012-05-12 03:39:53

标签: java regex tokenize lexical-analysis

我有一个创建词法分析器的任务,它将语言翻译成一系列标记。我正在使用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;
    }

我的问题是:是否有一个正则表达式可以分离这种语言?或者我是否因为尝试仅使用一个正则表达式而错过了我的任务?一些词汇约定是:标识符以小写字母或下划线的大写开头,后跟任何单词字符。允许使用注释行和块。数字是无符号整数或十进制表示法中的实数。还有像int,double,if等关键字和*,/,+等特殊符号

我可以为每个单独的约定制作正则表达式,但我不知道如何将它们组合成1,就像我的程序所要求的那样。

我也使用(?://.*)|(/\\*(?:.|[\\n\\r])*?\\*/)作为评论的正则表达式,但它似乎不适用于评论行,只是评论块。可以这样将文件读成单行字符串的原因是什么?

3 个答案:

答案 0 :(得分:3)

Lexers通常被编写为有限状态机。使用正则表达式是非常浪费和不必要的奥术。建议你看看“龙书”,

http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用java.util.StringTokenizer,但在很多情况下,这不够灵活。

当然你可以编写自己的标记器。一旦你自己完成,这并不像听起来那么难。有些人会告诉你,你应该使用一个工具/库,但是大部分人都说这样做是因为他们在学校就像这样学习它,并且在编写/维护标记器时没有真正的实际经验。解析器。有很多开源手写的标记器和解析器,例如JSON/JSOP TokenizerJCR XPath ParserJCR SQL-2 Parser