java - 伪编程语言的正则表达式

标签 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;
    }

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

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

我还使用 (?://.*)|(/\\*(?:.|[\\n\\r])*?\\*/) 作为我的评论正则表达式,但它似乎不适用于评论行,仅适用于评论 block 。将文件读入一行字符串的方式可能是造成这种情况的原因吗?

最佳答案

我推荐下载TinyPG .它是一个 Tiny Parser Generator,支持类似于 EBNF(扩展巴科斯范式)的语言语法。它适用于 C#/VB,但基本的语法定义应该教会你很多关于解析器的知识。如果您了解 C# 或 VB,则可以检查生成的解析器以获得创建您自己的解析器的一些想法。

关于java - 伪编程语言的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10560884/

相关文章:

java - 如何在数组列表中搜索匹配元素,然后使用这些元素创建列表

java - 使用 JAK kml 库编码时如何保持字符串格式

javascript - 如何在函数中使用 javascript 正则表达式反向引用?

java - 使用 Lucene 和 Java 标记化、删除停用词

c - 如何扫描输入字符串以获取 token 流

java - 如何添加使用 JAVA 而不是 odbc32.exe 连接到 MS DB 的新系统 DSN?

javascript - 正则表达式从 CSS 选择器字符串中提取 HTML5 类

regex - 为什么 sed 不将\t 识别为制表符?

python - 在 Python 中对推文进行标记

java - 在Java中将.gz文件分割成指定的文件大小