我正在编写一个非常基本的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 (;)

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这样的工具.

在此先感谢您的帮助.

解决方法

您需要做的第一件事就是丢弃所有的空格(除了字符串中的空格).这样,当您将令牌添加到令牌列表时,您确定该列表仅包含有效令牌.例如,请考虑以下声明:
echo "Here is the date: " & date();

我将开始标记并首先根据空白区域分离回声(是的,此处需要使用空格来分隔它,但在此之后无效).然后令牌器遇到双引号并继续读取所有内容,直到找到结束双引号.同样,我为&,date和()创建了单独的标记.

我的令牌列表现在包含以下令牌:

echo
“Here is the date: “
&
date
()

现在,在解析阶段,我们读取这些令牌.解析器循环遍历令牌列表中的每个令牌.它读取echo并检查它是否有效(基于您对该语言的规则/功能).它前进到下一个标记,并查看它是日期,字符串还是数学.同样,它会检查其余的令牌.如果在任何时候,不应该存在令牌,则可以抛出指示语法错误或其他内容的错误.

对于数学语句标记化,仅分别包含括号中的表达式和其余的操作数和运算符.例如:9/3(7-3 1)将具有令牌9,/,3和(7-3 1).由于每个令牌都有自己的优先级(您在令牌结构中定义),因此您可以从最高优先级令牌开始评估到最低令牌优先级.这样您就可以使用优先级表达式.如果您仍然有困惑,请告诉我.我会给你写一些示例代码.

c# – 编写一个非常简单的解析器的更多相关文章

  1. 离子运行android似乎工作,但该应用程序没有在手机上启动,为什么?

    我的手机处于打开状态,处于调试模式,我已通过adbdevices-l确认了这一点.当我运行离子运行android时,我得到Ionic声称应用程序启动时的输出,但手机上没有任何反应.我使用Android4.4.4的Nexus5.androidapp中的index.html:解决方法键入离子信息并检查已安装的Cordova版本.如果你有v5.0.0现在需要一个新的插件,否则所有的http请求都被阻止.

  2. php中echo与print区别点整理

    在本篇文章里小编给大家整理的是一篇关于php中echo与print区别点,需要的朋友们可以参考下。

  3. php编程中echo用逗号和用点号连接的区别

    本文通过几个具体的例子.来认清楚php编程中echo用逗号和用点号连接之前的区别.有需要的小伙伴可以参考下

  4. 基于php中echo用逗号和用点号的区别详解

    下面小编就为大家分享一篇基于php中echo用逗号和用点号的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  5. PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码

    这篇文章主要介绍了PHP中的输出echo、print、printf、sprintf、print_r和var_dump的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. PHP写API输出的时用echo的原因详解

    在本篇文章里小编给大家分享了关于PHP写API输出的时用echo的原因和相关知识点,需要的朋友们参考下。

  7. PHP Echo字符串的连接格式

    这篇文章主要介绍了PHP Echo字符串的连接格式 的相关资料,需要的朋友可以参考下

  8. 浅析PHP echo 和 print 语句

    这篇文章主要介绍了PHP echo 和 print 语句的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

  9. PHP7 echo和print语句实例用法

    在本文中小编整理了在PHP7中echo和print语句实例用法以及相关知识点内容,需要的学习下。

  10. php echo 输出字符串函数详解

    echo()函数的作用是:输出一个或多个字符串。 这里给简单的整理下,希望对需要的朋友有所帮助。

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部