为简单的伪代码语言创建解析器?

Vin*_*arg 2 java parsing

我想在Java中创建一个简单的解析器,用于像伪语言(保持僵化)的"伪代码".一个示例伪代码是 -

//This is a comment
$x1 = readint
$x2 = readint

$dx = $x2 - $x1
#f = $dx / 2

if ($dx > 0)
{
  loop while(#f > 1)
  {
     print(#f)
     #f = #f / 2
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码是严格的,在一行上不能有多个语句,整数以$开头,浮点数以#开头等.

要解析这样的代码,首先我可以使用StringTokenizer,然后使用正则表达式来匹配整数变量,浮点变量或关键字.

这种做法好吗?对于循环语句,我如何存储表达式,以便我不必在每次迭代中进行标记化?

我可以考虑将表达式(如#f = #f/2)转换为抛光表示法,然后将其存储在堆栈中.在每次迭代中,在弹出操作数时,我可以替换每个变量的值.但这足够有效吗?

提前感谢,任何建议.

tem*_*def 11

虽然我认为你想为这样的语言构建一个解析器很棒,但这样做比它看起来要困难得多.解析是一个研究得很好的问题,你可以使用许多优秀的算法,但它们很难手工实现.虽然您可以使用诸如转换为RPN等技巧来处理较小的示例(如解析表达式),但构建完整的编程语言需要更复杂的技巧.

要解析这种复杂性的语言,最好使用解析器生成器而不是尝试自己编写自己的语言. ANTLRJava CUP是两个众所周知的工具,可以准确地完成您想要完成的任务,我强烈建议您使用其中的两个.

希望这可以帮助!