基于上下文无关语法解析正则表达式

时间:2014-12-09 19:25:29

标签: java regex parsing

晚上好,Stack Overflow。 我想基于一个非常简单的无上下文语法为表达式开发一个解释器:

Grammar

基本上,语言由2个基本语句构成

( SET var 25 ) // Output: var = 25
( GET ( MUL var 5 ) ) // Output: 125
( SET var2 ( MUL 30 5 ) ) //Output: var2 = 150

现在,我非常确定我应该怎样做才能解释一个陈述:1)词法分析将一个陈述变成一个令牌序列2)语法分析得到一个符号表(HashMap with the变量及其值)和语法树(执行GET语句)3)执行树的顺序访问以获得我想要的结果。

我想要解析源文件的解析方法。考虑到解析器应该忽略任何空格,制表或换行符,是否可以使用Java模式来获取我想要分析的一般语句?是否有一种很好的方法来阅读奇怪格式化(可能更复杂)的语句,如此

(
  SET var

 25
 )

不会将解析器与开放和封闭的括号混淆?

例如

Scanner scan; //scanner reading the source file
String pattern = "..." //ideal pattern I've found to represent an expression
while(scan.hasNext(pattern))
  Interpreter.computeStatement(scan.next(pattern));

这个问题是否可行?

1 个答案:

答案 0 :(得分:1)

最后,我理解感谢Ira Baxter,这个上下文无关语法不能用RegExp解析,我使用S-Expressions的概念来构建解释器,你可以找到它的源代码{{ 3}}。如果您对此有任何疑问(主要是因为评论不是用英语翻译的,即使我认为代码非常清楚),请在此留言或发表评论。

基本上我所做的是:

  • 解析每个字符并对其进行标记(例如'(' - >是OPEN_PAR,而" SET" - > STATEMENT_SET或随机字母如' b&# 39;被解析为VARIABLE)
  • 然后,我使用创建的令牌列表进行语法分析,根据语法检查令牌列表中出现的模式
  • 如果语句中有表达式,我会递归检查表达式中的任何表达式,抛出异常并在需要时转到以下正确的语句
  • 在分析每个语句的最后,我根据规范
  • 计算必要的语句