我想用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
}
}
请注意,上面的代码是严格的,因为一行上不能有多个语句,整数以$开头,浮点数以#开头等。
要解析此类代码,首先可以使用StringTokenizer
,然后使用正则表达式来匹配整数变量,浮点变量或关键字。
这种方法好吗?对于循环语句,我如何存储表达式,这样就不必在每次迭代中都进行标记化?
我可以考虑将表达式(例如#f = #f /
2)转换为波兰式表示法,然后存储在堆栈中。并且在每次迭代中,当弹出操作数时,我可以为每个变量替换值。但这足够有效吗?
在此先感谢您的任何建议。
尽管我认为您希望为这样的语言构建解析器是一件很棒的事情,但是这样做比看起来要困难得多。解析是一个经过充分研究的问题,您可以使用许多出色的算法,但是手工很难实现它们。尽管您可以将诸如转换为RPN之类的技巧用于解析表达式之类的较小示例,但是构建完整的编程语言需要一组更为复杂的技巧。
要解析这种复杂的语言,最好使用解析器生成器,而不是尝试手动编写自己的语言。 ANTLR和Java
CUP
是两个众所周知的工具,它们可以精确地完成您感兴趣的工作,我强烈建议您使用这两个工具之一。
希望这可以帮助!
我在XText中定义了我的DSL,它自动生成了Java版本的语言解析器和代码生成框架,这真的很酷。 问题是我的DSL被使用多种语言的项目所消耗。你可以想象我们可能至少需要用C#、Java和Ruby来解析DSL。 所以问题是:有没有办法在xtext的帮助下为多种语言生成解析器?
本文向大家介绍易语言简单的安装代码总结,包括了易语言简单的安装代码总结的使用技巧和注意事项,需要的朋友参考一下 新建一个窗口程序,然后添加一个时钟,再添加两个按钮(名称别去修改,就这样) 首先复制粘贴DLL部分内容: .版本 2 .DLL命令 CallWindowProc, 整数型, "user32.dll", "CallWindowProcA", , 呼叫窗口函数地址 .参数 前一窗口函数地址,
主要内容:1) 去掉循环冗余括号,2) 去掉表达式冗余括号,3) 强制的代码风格,4) 不再纠结于 i++ 和 ++iGo语言语法类似于C语言,因此熟悉C语言及其派生语言( C++、 C#、Objective-C 等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的基础上取其精华,弃其糟粕,将C语言中较为容易发生错误的写法进行调整,做出相应的编译提示。 1) 去掉循环冗余括号 Go语言在众多大师的丰富实战经验的基础上诞生,去除了C语言语法中一些冗余、
本文向大家介绍Java语言求解完美数代码分析,包括了Java语言求解完美数代码分析的使用技巧和注意事项,需要的朋友参考一下 1、概念 首先我们理解一下,什么叫做完美数? 问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数。简称“完数” 例如, 6=1+2+3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+2
本文向大家介绍易语言基础教程之简单代码的编写,包括了易语言基础教程之简单代码的编写的使用技巧和注意事项,需要的朋友参考一下 要想使自己做的程序运行起来,就需要编写代码,下面我就以一个简单的程序为例,讲解一下代码编写过程 代码编写过程 我制作的小程序的功能就是当我点击点击按钮是,界面会出现“追梦小达人” 要想实现此功能,首先鼠标要双击一下点击按钮,进入程序编辑界面 这个子程序的完整代码为: 这个子程
问题内容: 请以简单的语言向我解释。请不要发布网络链接,因为我需要阅读开发人员而不是作者的理解。 问题答案: 我能为您指出的最好是SQL Join的直观说明。 这些图表对我有很大帮助。 从此处的链接文章中添加主要图表。 内部联接 内部联接仅生成在表A和表B中都匹配的记录集。 完全外部联接 完全外部联接将生成表A和表B中所有记录的集合,并在可用时提供双方的匹配记录。如果没有匹配项,则缺少的一面将为空