例如:
echo "Here is the date: " & date();
echo "9 x 15 = : & 9*15;
我已经浏览并创建了生成令牌所需的代码,但我不确定我是否使用了正确的令牌。
我为以下内容创建了令牌:
ECHO - The echo command
WHITESPACE - Any whitespace
STRING - A string inside quotations
DATE - The date() function
CONCAT - the & operator for concatenation
MATH - Any instance of binary operation (5+4, 9*2, 8-2, etc)
TERM - The terminal character (;)
我特别不确定MATH这个标记的使用方法。通常我看到人们为整数和每个运算符创建一个特定的标记,但由于我只想允许二进制操作,所以我认为将它们分组成一个标记是有意义的。如果我要单独处理每个标记,我需要做一些额外的工作来确保我从不接受"5+4+1"。
所以问题1是,我使用哪些标记是正确的?
我的下一个问题是,我该如何使用这些标记来确保正确的语法?我的想法是基本上说,“好的,我知道我有这个标记,这是一个基于当前标记允许出现的标记列表。下一个标记是否在列表中?”
基于此,我列出了所有我的标记以及直接在它们后面出现的有效标记列表(为简单起见,未包括空格)。
ECHO -> STRING|MATH|DATE
STRING -> TERM|CONCAT
MATH -> TERM|CONCAT
DATE -> TERM|CONCAT
CONCAT -> STRING|MATH|DATE
问题在于我不确定如何最好地实现这个。实际上,我还需要跟踪空格,以确保标记之间有空格。但这意味着我必须一次性查看两个标记,这使问题变得更加棘手。而且,我也不确定如何管理“有效的下一个标记”内容,除非使用一些令人作呕的 if 块。我应该在尝试执行脚本之前检查语法是否有效,还是应该一次性完成所有操作,并在到达意外的标记时抛出错误?在这个简单的示例中,从左到右解析总是可以正常工作的,没有真正的优先规则(除了 MATH 这件事,但这也是我将其合并成一个标记的原因,即使它感觉不对)。即便如此,我也不介意设计一个更具可扩展性和优雅的解决方案。
在我的解析器编写研究中,我看到很多关于创建“accept()”和“expect()”函数的参考,但我找不到任何清晰的说明描述它们应该做什么或者它们应该如何工作。
我想我只是不确定如何实现这个,然后如何在一天结束时实际得出一个结果字符串。
我正在朝着正确的方向前进,是否有人知道可能会帮助我理解如何最好地实现像这样的简单东西的资源?我必须手动完成它,不能使用 ANTLR 等工具。
提前感谢您的帮助。