我正在编写一个非常基本的 Web 服务器,它必须支持极其有限的特殊服务器端脚本语言。基本上我需要支持的是“echo”,只有 2 个操作数的加法/减法/乘法(无除法),一个简单的“date()”函数,输出日期和使用“&”运算符连接字符串。
一个例子可能是:
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 (;)
我特别不确定的数学。通常我看到人们专门为整数创建一个标记,然后也为每个运算符创建一个标记,但由于我只想允许二进制操作,我认为将它分组为一个标记是有意义的。如果我要单独做所有事情,我将不得不做一些额外的工作,以确保我永远不会接受“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 这样的工具。
提前感谢您的帮助。