Java 如何有效地执行语法分析/解析?

Java 如何有效地执行语法分析/解析?,java,regex,parsing,token,text-parsing,Java,Regex,Parsing,Token,Text Parsing,我的任务是手工实现解析器,因此使用解析器生成器是不可能的。但我就是找不到一种有效的方法来实现语法分析。我已经设法做到了“手动”,但我担心这不仅是非常低效的,而且我也有边缘的情况下,它不会工作 假设我有一个伪语言,其中变量由以下语法定义: DECLARE-VAR. VARNAME. 同时,该语言还规定,对于算术运算,每个算术运算符的前面和后面必须有空格。所以 X-Y正确,但X-Y不正确 我想构建一个解析器(以Java为参考),逐行分析源代码,并告诉我一行是否有问题 我们已经有了一个冲突,因为我声

我的任务是手工实现解析器,因此使用解析器生成器是不可能的。但我就是找不到一种有效的方法来实现语法分析。我已经设法做到了“手动”,但我担心这不仅是非常低效的,而且我也有边缘的情况下,它不会工作

假设我有一个伪语言,其中变量由以下语法定义:

DECLARE-VAR. VARNAME.
同时,该语言还规定,对于算术运算,每个算术运算符的前面和后面必须有空格。所以
X-Y
正确,但
X-Y
不正确

我想构建一个解析器(以Java为参考),逐行分析源代码,并告诉我一行是否有问题

我们已经有了一个冲突,因为我声明
DECLARE-VAR
是有效的语法,同时还说
-
前面和后面应该有空格

因此,我手动检查以下情况:

if(!lineToCompare.toUpperCase().matches("[A-Z]+\\-[A-Z]+.*$") && lineToCompare.contains("-")){
                        char[] charArr = lineToCompare.toCharArray();
                        boolean problemWithOperator = false;
                        for(int i = 0; i < charArr.length;i++){
                            if(charArr[i] == '-' && (charArr[i-1] != ' ' || charArr[Math.min(charArr.length -1, i+1)] != ' ')){
                                System.out.println("A minus sign must be preceded and followed by white space")
                            }
                        }
                        
                    }

我的程序不会认为这是一个问题,因为这行是匹配<代码> [AZ] +[-ZZ++/COD> >,尽管<代码> 1-2 应该在没有空格之间引发错误。


所以我想知道,有没有一个更简单的方法来做这件事,我错过了?我正在考虑将所有内容逐字分解,但如果我只能逐个检查字符,或者如果同一行中出现了多个问题,我无法找到检查正确字符的好方法。

我需要自己进行解析来演示。这只是一种伪语言,所以没有太多东西需要检查。我现在最大的问题基本上就是我所描述的:边缘情况,你不需要检查一个符号的特定实例,因为它在它的当前位置是正确的。我可以将DECLARE-VAR添加到保留字的HashMap中,但是当我检查行中减号的有效性时,它会遇到DECLARE-VAR中的一个,并说它是错误的,听起来好像你想先解析成标记(标识符、运算符、空格等)@john3136我真的认为这是正确的方法,但我遗漏了一些东西。。。例如,如果我使用令牌,我的理解是我基本上创建了一组模式来获取令牌,对吗?但我如何发现像我在原始帖子中描述的那样的案例呢?如果我创建了一个模式来获取减号,我将如何检查这些减号是否有空格并且它们不是保留字的一部分?我不会使用正则表达式。谷歌词汇分析
DECLARE-VAR
似乎是一个独特的标记。句点是一个标记,空格是一个标记,
varname
是一个标识符
1
是一个文本
-
是一个运算符
2
是一个文本,因此您将得到一系列标记:声明句点空格标识符句点空格文本运算符文本。这是不合法的,因为操作员需要两边都有空格。
DECLARE-VAR. VARNAME. 1-2