C# 实现类似编译器的功能

花开花折 2018-05-03 04:23:01
想自己实现一个简单的类似编译器的功能,界面类似如下两张图中所示。
1:想实现的功能如下:
A:客户能够根据已有的指令(加\减\乘\除、IF---ELSE WHILE 及自定义指令),自己编写业务逻辑代码,然后将代码保存到文本中;
B:程序运行时,读取文本中的代码,根据业务逻辑代码程序执行相应的业务逻辑。

2:当前遇到的难点:
A:客户在编写代码时,可能会出现格式错误的现象,怎样判断当前客户代码编写异常,即怎样进行语法检查。
B:IF---ELSE---ENDIF 条件语句在编写时会占用多行且可能会存在内部嵌套。怎样识别当前IF开始语句对应那个ENDIF结束语句。

3:各位大神指点下或给点思路或资料。谢谢。

...全文
1542 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡龙 2018-05-05
  • 打赏
  • 举报
回复
牛啊,打算自己写解释器啊
巴士上的邂逅 2018-05-05
  • 打赏
  • 举报
回复
把汇编的编译器整合到你的程序中,至于那些自定义的指令,就通过C#转化为汇编编译器能识别的代码
  • 打赏
  • 举报
回复
引用 15 楼 u010909114 的回复:
[quote=引用 6 楼 xomix 的回复:] [quote=引用 5 楼 u010909114 的回复:] [quote=引用 3 楼 duanzi_peng 的回复:] 让客户编写代码有点意思。 这个相当于要搞一个类似C#,VB的编译器了,这个难度可想而知。
是不是我把问题描述的太复杂了,在自动化设备行业,好多公司软件都有类似的功能啊 我只想搞个简单点的,能够实现基本功能就行啊。 [/quote] Roslyn 这个关键词请你搜索一下你不会中病毒的!我简直受不了这种指路不行非要嚼碎了喂到嘴里的。[/quote] 1:大神,我项目中的指令如WAIT MOVJ等都是我自己定义的,语法格式也是自己定义的哦 2:利用Roslyn来实现我项目中的功能,好像不行吧,还是我没有完全了解Roslyn的功能? 3:求指点。谢谢。[/quote] mov=goto wait=async/await/sleep 你可以用这些c#代码替换你的代码实现动态输出。
「已注销」 2018-05-04
  • 打赏
  • 举报
回复
编译器功能难道不应该是构建语法树吗?找个ANTLRFlex、LALR……就好。 更多亮点找这里
花开花折 2018-05-04
  • 打赏
  • 举报
回复
引用 9 楼 wanghui0380 的回复:
这玩意其实叫文本DSL(特定领域语法),这个东西一般用yacc,antlr去解析分析,形成语法树了,按语法树递归执行 比如你这玩意,我稍微百度一下大概是“安川机器人”的语法,这个你就得自己按照人家的语法规则,编写BNF范式,交给yacc,antlr去生成就好 如果不会编写BNF范式,你就别做了。你需要捡的东西太多。不如直接使用在C#里嵌入lua,ironpython,nodejs来的简单(当然lua这类算通用语言,并不是你要求的安川机器人专有语法)
1:大哥,你这推荐的几种语言 语法格式\指令都是别人定义好了,现在我这项目中的指令如WAIT MOVJ等都是我自己定义的;即使我在C#里嵌入lua,ironpython,nodejs也用不上啊。 2:我查了下安川机器人\欧姆龙PLC他们公司的指令代码 跟我上面图片中语法格式\指令差不多一样。我在想是否有实现类似功能的开发框架或架构什么的?? 3:大神,你也是做工业自动设备类软件的吗? 谢谢。
花开花折 2018-05-04
  • 打赏
  • 举报
回复
引用 6 楼 xomix 的回复:
[quote=引用 5 楼 u010909114 的回复:] [quote=引用 3 楼 duanzi_peng 的回复:] 让客户编写代码有点意思。 这个相当于要搞一个类似C#,VB的编译器了,这个难度可想而知。
是不是我把问题描述的太复杂了,在自动化设备行业,好多公司软件都有类似的功能啊 我只想搞个简单点的,能够实现基本功能就行啊。 [/quote] Roslyn 这个关键词请你搜索一下你不会中病毒的!我简直受不了这种指路不行非要嚼碎了喂到嘴里的。[/quote] 1:大神,我项目中的指令如WAIT MOVJ等都是我自己定义的,语法格式也是自己定义的哦 2:利用Roslyn来实现我项目中的功能,好像不行吧,还是我没有完全了解Roslyn的功能? 3:求指点。谢谢。
花开花折 2018-05-04
  • 打赏
  • 举报
回复
引用 12 楼 wowfiowow 的回复:
不要造轮子,直接用模块
关键是我没有模块啊。
橘子皮... 2018-05-03
  • 打赏
  • 举报
回复
不要造轮子,直接用模块
ilikeff8 2018-05-03
  • 打赏
  • 举报
回复
这涉及到语义解析了,不过如果你严格规定每一行只能写一个命令语句的话,逐行解释就是了,嵌套就开个堆栈来配对,第一步还得格式整理,把多余的空格之类的去掉
wanghui0380 2018-05-03
  • 打赏
  • 举报
回复
看了一下这个语法规则,基本类似logo语言的语法,你基本可以在logo BNF的基础上修改(如果你看的懂BNF的话) 下面是logo语言的antlr4解析文件 https://github.com/antlr/grammars-v4/blob/master/logo/logo.g4
wanghui0380 2018-05-03
  • 打赏
  • 举报
回复
这玩意其实叫文本DSL(特定领域语法),这个东西一般用yacc,antlr去解析分析,形成语法树了,按语法树递归执行 比如你这玩意,我稍微百度一下大概是“安川机器人”的语法,这个你就得自己按照人家的语法规则,编写BNF范式,交给yacc,antlr去生成就好 如果不会编写BNF范式,你就别做了。你需要捡的东西太多。不如直接使用在C#里嵌入lua,ironpython,nodejs来的简单(当然lua这类算通用语言,并不是你要求的安川机器人专有语法)
xuzuning 2018-05-03
  • 打赏
  • 举报
回复
像你这种简单的语言,一棵 trie 树(用于词法识别)一个字典(用于指示相应的动作)就可以了
花开花折 2018-05-03
  • 打赏
  • 举报
回复
引用 6 楼 xomix 的回复:
[quote=引用 5 楼 u010909114 的回复:] [quote=引用 3 楼 duanzi_peng 的回复:] 让客户编写代码有点意思。 这个相当于要搞一个类似C#,VB的编译器了,这个难度可想而知。
是不是我把问题描述的太复杂了,在自动化设备行业,好多公司软件都有类似的功能啊 我只想搞个简单点的,能够实现基本功能就行啊。 [/quote] Roslyn 这个关键词请你搜索一下你不会中病毒的!我简直受不了这种指路不行非要嚼碎了喂到嘴里的。[/quote] 大神,我错了,我搜搜啊,晚点回你。谢谢
xuzuning 2018-05-03
  • 打赏
  • 举报
回复
你应该学习过 编译原理 吧 也应该知道判断语法错误的依据是 文法范式 嵌套的语法结构的识别,靠的是栈
exception92 2018-05-03
  • 打赏
  • 举报
回复
让客户编写代码有点意思。 这个相当于要搞一个类似C#,VB的编译器了,这个难度可想而知。
  • 打赏
  • 举报
回复
引用 5 楼 u010909114 的回复:
[quote=引用 3 楼 duanzi_peng 的回复:] 让客户编写代码有点意思。 这个相当于要搞一个类似C#,VB的编译器了,这个难度可想而知。
是不是我把问题描述的太复杂了,在自动化设备行业,好多公司软件都有类似的功能啊 我只想搞个简单点的,能够实现基本功能就行啊。 [/quote] Roslyn 这个关键词请你搜索一下你不会中病毒的!我简直受不了这种指路不行非要嚼碎了喂到嘴里的。
花开花折 2018-05-03
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
让客户编写代码有点意思。 这个相当于要搞一个类似C#,VB的编译器了,这个难度可想而知。
是不是我把问题描述的太复杂了,在自动化设备行业,好多公司软件都有类似的功能啊 我只想搞个简单点的,能够实现基本功能就行啊。
wanghui0380 2018-05-03
  • 打赏
  • 举报
回复
这个轮子不好做,你可以直接用现成的,比如lua,python,nodejs 自己做有些浪费时间
  • 打赏
  • 举报
回复
直接用Roslyn吧,动态执行代码。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧