Java 将表达式解析为其组件和子组件

Java 将表达式解析为其组件和子组件,java,parsing,abstract-machine,Java,Parsing,Abstract Machine,我需要解析一个表达式,例如:neg(和(X,Y)) 我需要它产生抽象堆栈机器代码,例如上面的示例: LOAD X; LOAD Y; EXEC and; EXEC neg; 但是现在机器代码不是问题,我如何将一个表达式的输入字符串解析/分解为它的所有子表达式 我试着找到第一个括号,然后从这个括号到最后一个括号,但是如果你有一个内在的表达式,那就没有用了 我尝试过的代码:(请不要,它仍处于开发阶段) private boolean evaluateExpression(字符串表达式){ int括号

我需要解析一个表达式,例如:
neg(和(X,Y))

我需要它产生抽象堆栈机器代码,例如上面的示例:

LOAD X;
LOAD Y;
EXEC and;
EXEC neg;
但是现在机器代码不是问题,我如何将一个表达式的输入字符串解析/分解为它的所有子表达式

我试着找到第一个括号,然后从这个括号到最后一个括号,但是如果你有一个内在的表达式,那就没有用了

我尝试过的代码:(请不要,它仍处于开发阶段)

private boolean evaluateExpression(字符串表达式){
int括号=0;
int beginIndex=-1;
int-endIndex=-1;
for(int i=0;i

我只是在寻找一个基本的解决方案,它只需要做:和,或者,neg

实际上,如果您希望您的解析器足够强大,能够处理大多数情况,那么您需要使用一个标记器(java有一个实现的标记器类)首先标记字符串,然后尝试识别每个表达式,将操作数和运算符存储在树结构中,然后递归计算它们


如果您只想处理一些简单的情况,请记住使用递归,这是核心部分~

您试图解析的表达式实际上正在生成一个,可以表示为

您可以创建表示这种表达式语言的上下文无关语法,并使用CFG解析器对其进行解析

一个现有的java工具可以做到这一点(以及更多),尽管它在这里可能是一个过度的杀伤力。
使用CFG解析句子的另一个算法是,它相当容易编程和使用


在这里,表示可用表达式的CFG是:

S -> or(S,S)
S -> and(S,S)
S -> not(S)
S -> x | for each variable x

请注意,虽然这是相对简单的CFG,但它所描述的语言是不规则的,因此如果您希望使用regex,那么这可能不是一种解决方法。

像这样的解析通常是使用语法树来完成的,对操作顺序使用某种类型的首选项。您发布的示例如下:

Processing items left to right the tree would be populated like this

1arg_fcall(neg)
        2arg_fcall(and)
            Load Y                      
            Load X

Now we can recursively visit this tree bottom to top to get
Load X
Load Y
EXEC and //on X and Y
EXEC neg //on result of and

好的,我明白你的意思了,这是我一直在尝试的方法,但是我用什么来标记字符串:查看我的编辑:我的表达式当前是否处于上下文无关语法中?@Zapnologica我添加了描述你试图解析的语言的CFG。
Processing items left to right the tree would be populated like this

1arg_fcall(neg)
        2arg_fcall(and)
            Load Y                      
            Load X

Now we can recursively visit this tree bottom to top to get
Load X
Load Y
EXEC and //on X and Y
EXEC neg //on result of and