Java 手工编写命题逻辑分析器

Java 手工编写命题逻辑分析器,java,parsing,grammar,lexer,finite-automata,Java,Parsing,Grammar,Lexer,Finite Automata,我需要为命题逻辑做一个解析器。我假装是用手工实现的,就像java中的递归下降解析器一样 我的问题是关于lexer的,这份工作真的需要它吗?我的意思是定义一个有限状态机来识别令牌等。 我见过一些简单的算术解析器的例子,它们在一个“单一解析器”中处理所有的问题,只依赖于语法规则。看起来他们并不关心为解析器提供标记的独立lexer 因为我想以最正确的方式来做这件事,所以我想为这份工作寻求建议。欢迎提供相关信息的任何链接。更多的信息将非常有用,即您要使用的语法和示例输入字符串。我不知道你对乔姆斯基的语法

我需要为命题逻辑做一个解析器。我假装是用手工实现的,就像java中的递归下降解析器一样

我的问题是关于lexer的,这份工作真的需要它吗?我的意思是定义一个有限状态机来识别令牌等。 我见过一些简单的算术解析器的例子,它们在一个“单一解析器”中处理所有的问题,只依赖于语法规则。看起来他们并不关心为解析器提供标记的独立lexer


因为我想以最正确的方式来做这件事,所以我想为这份工作寻求建议。欢迎提供相关信息的任何链接。

更多的信息将非常有用,即您要使用的语法和示例输入字符串。我不知道你对乔姆斯基的语法水平了解多少,但这是关键。简而言之,lexer可以在单词级(第3级:常规语法)上解析,解析器也可以分析语法(第2级:上下文无关语法)。(更多信息请参见此处:)

使用无扫描解析器是可能的,但我认为如果您在编写时不避免使用lexer,那么您只需要将lexer集成到解析器中。换句话说,如果你编写你的程序,你会把标记原始输入字符串的部分称为lexer,把应用语法的部分称为parser,如果你想这样称呼它的话。但是你不应该在条款上说太多。如果您编写了一个解析器而不需要lexer,那么很有可能lexer已经存在于您的代码中,但谁在乎呢;)希望这能有所帮助,但请随意询问是否仍不清楚

这种解析器不需要“真正的”词法分析器。您确实需要一些能够去除语言原子的东西(标识符、运算符、括号)。您可以直接在解析器中对简单语言执行此操作


请参阅我关于如何编写简单解析器的答案:

Nice链接。理论上,词法分析器将处理命题逻辑的规则语法,运算符NOT、OR、AND等,解析器将处理逻辑的格式良好的公式(上下文无关语法)。也许对于mi的情况,lexer没有太多的工作要做,但可以用于实践和学习,因为我对这个主题是新的。我想如果我以后想解析不同的语言,使用一个单独的lexer会更方便,也更容易扩展。我真的不想避免任何事情,这只是为了学习。解析器从词法分析器中一个接一个地获取标记,或者首先词法分析器完成他的工作,并立即将所有标记发送给解析器?。我想这两种方法都可以,但是哪一种更好呢?如果是为了学习一个单独的词汇量,理解力学肯定更好。我想,首先标记所有标记,然后解析它们会更清楚,特别是如果不是要尽快解析,另外你可以看到明文、标记和结果之间的切割。