【发布时间】:2012-10-29 22:44:16
【问题描述】:
我正在编写一个非常基本的 Web 服务器,它必须支持极其有限的特殊服务器端脚本语言。基本上我需要支持的是“回显”,只有 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 之类的工具。
提前感谢您的帮助。
【问题讨论】:
-
你很幸运,我的朋友,有人已经完成了困难的部分。 irony.codeplex.com
-
你也可以使用Javascript stackoverflow.com/questions/12118077/…
-
@asawyer,我想你错过了 “我需要手工完成,不能使用像 ANTLR 这样的工具”,所以很可能也不允许讽刺...
-
@BartKiers 也许,但由于它生成一个普通的 c# 程序集,我认为它可能是可行的。
-
这是作业吗?如果是也可以,但你应该使用homework 标签。
标签: c# parsing compiler-construction scripting