MOO 编程语言 ANTLR4 语法解析:grammars-v4 中的 moo 语法工程实战指南
编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载本指南围绕 grammars-v4 仓库中的 moo 语法模块展开系统讲解 MOOLambdaMOO 家族编程语言在 ANTLR4 下的词法/语法规则设计、声明命令覆盖范围、表达式求值结构与示例程序解析方式并给出基于 Maven 的构建与回归测试实践。读完本文你将掌握如何阅读与复用这份无内嵌 action 的纯语法文件moo.g4并能借助仓库自带的示例与测试配置快速完成语法验证。一、模块概览一份为 MOO 源码服务的 ANTLR4 语法moo 是 grammars-v4 仓库中为 MOO 语言编写的 ANTLR4 语法模块遵循仓库grammars free of actions的约定——语法文件本身不含任何目标语言内嵌动作因此可跨目标语言生成解析器。模块结构如下moo.g4语法主文件词法规则与语法规则合并在同一文件中顶层入口规则为progdesc.xml声明该语法支持的目标语言生成包括 CSharp、Cpp、Dart、Go、Java、JavaScript、PHP、Python3、TypeScript 与 Antlr4ngpom.xml基于 antlr4-maven-plugin 的构建配置并启用 antlr4test-maven-plugin 对 examples 目录下的示例做回归解析examples8 个 MOO 程序示例hello.txt、drone.txt、target.txt、dest.txt、strike.txt、toy.txt、cupcake.txt等均取自 Rob Myers 编写的 MOO 代码集合覆盖了语法文件的大多数声明与语句形态。从语法文件头部注释可见该语法在设计时参考了 LambdaMOO 程序员手册Programmers Manual中关于 MOO 语言定义的章节若需深究 MOO 语义可对照 GLOSSARY.md 了解仓库术语约定后继续阅读语法本身。二、顶层结构prog与declaration语法从prog规则开始一个合法的 MOO 程序文件由若干条声明组成并以 EOF 收尾moo.g4prog : declaration EOF ;declaration是 MOO 源码文件中最核心的语法单元它把 MOO 编程中常见的命令式声明全部纳入同一入口moo.g4declaration : programdecl | verbdecl | propertydecl | rmpropertydecl | setpropertydecl | displaypropertydecl | kidsdecl | parentdecl | describedecl | contentsdecl | noteditdecl | createdecl | editdecl | addaliasdecl ;可以看到声明层涵盖了 MOO 对象编辑会话中的全部典型操作定义程序program、定义动词verb、定义/删除/设置/展示属性property、rmproperty、set、display、查询父子与内容关系kids、parent、contents、描述属性describe、禁止编辑notedit、创建对象create、编辑属性edit以及添加别名addalias。这一设计使得一个 MOO 源码文件通常由list命令导出可以被整体解析成单一语法树。三、声明命令详解从program到addalias每个声明规则对应 MOO 编辑器中的一条命令下面逐条结合 moo.g4 与示例文件说明其形态。3.1 程序定义programprogramdecl : program programname : name statement . ;程序声明以program开头后跟程序名:动词名接着是一组语句最后以点号.结束。程序名既可以是普通名称也可以是字符串字面量programname : name | stringliteral;。最经典的示例 hello.txt 完整展示了这一结构program hello:run player:tell(Hello to the world of MOO!); .3.2 动词定义verbverbdecl : verb (verbname : name) name permissions? ;verb声明用于定义动词签名对象:动词名后跟一组参数名并以可选的权限字符串结尾。示例 drone.txt 中有典型用法verb Drone:destination tnt rxd verb Drone:strike any any any rxd这里的tnt、rxd等即permissions规则对应词法规则PERMISSIONS : [rcxd]moo.g4其中rread、cchange、xexecute、ddebug是 MOO 对象属性的标准权限位。3.3 属性相关命令属性声明族覆盖了 MOO 属性生命周期管理的全部命令moo.g4propertydecl : (property | prop) property_ ? expression? permissions? ; rmpropertydecl : (rmproperty | rmprop) name ; setpropertydecl : set property_ to expression ; displaypropertydecl : (display | disp) property_ ;注意property的等号是可选的初始值与权限字符串同样可选这保证了旧式与新式 MOO 源码的兼容解析。drone 示例中的属性定义property Drone.target_parent #56953 rc property Drone.destinations {#78071} rc property Drone.messages {An unexpected drone strike hits %targets.} rccupcake 示例则展示了带等号与复杂字面量的写法set Cupcake Feature.help_msg to {A feature object for giving cupcakes to players., Use cupc*ake player to give a cupcake to someone., ...} property Cupcake Feature.decoration_probability 3 rcset ... to ...会把右侧表达式求值后写入属性其右侧可承载列表字面量等复杂值。3.4 描述、内容与编辑命令describedecl : describe property_ as expression ; contentsdecl : contents name ; noteditdecl : notedit property_ ; createdecl : create sysname called expressionlist ; editdecl : edit property_ ; addaliasdecl : addalias name (, name)* to expression ;describe为属性设置描述文本例如 cupcake 中的describe Cupcake Feature as A feature object for giving cupcakes to players..create创建对象实例如 drone 中的create $feature called Drone这里$feature是sysnameDOLLAR STRING?moo.g4$前缀在 MOO 中约定表示系统级对象addalias支持逗号分隔的多个别名后接to 表达式用于把别名批量挂到对象上。这些命令覆盖了 MOO 对象编辑器的绝大多数指令使语法能够解析完整的 MOO 源码转储文件。四、语句层MOO 命令式控制流programdecl内部由statement构成statement规则moo.g4聚合了 MOO 的全部语句形态statement : ifblock | whileblock | doblock | forblock | assignblock | tryblock | command SEMICOLON ;4.1 条件分支if/elseif/elseifblock : if condition statement (elseif condition statement)? (else statement)? endif ;? ;endif后的分号是可选的。toy 示例中的嵌套分支if (this.location player) if (this.wound this.maximum) this.wound this.wound 2; player:tell(You wind up the , this.name,.); else player:tell(The ,this.name, is already fully wound.); endif else player:tell(You have to be holding the , this.name,.); endif4.2 循环while、do...while、for...inwhileblock : while condition statement ; doblock : do statement while condition ; forblock : for name in expression statement endfor ;while无显式结束符靠条件括号闭合do...while先执行循环体再判断条件for name in (expr)遍历表达式通常是列表以endfor结束。target 示例展示了遍历对象内容列表的惯用法for candidate in (player.location.contents) if (parent(candidate) this.target_parent) targets listappend(targets, candidate); endif endfor4.3 赋值与异常处理assignblock : property_ ASSIGN expression SEMICOLON ; tryblock : try statement except property_ statement endtry ;赋值语句对左值property_赋值如 drone 中的targets {};try...except...endtry是 MOO 的异常捕获结构except后跟异常属性名语法文件对其做了完整的结构化支持。4.4 命令与返回command : verbinvocation | returncommand ; returncommand: return expression? ;语句以分号结尾return后的表达式可选如 cupcake 中return;提前退出。示例 strike.txt 综合展示了赋值、if、for与动词调用targets this:targets_in_room(); if (targets) place this:destination(); names {}; for target in (targets) names listappend(names, target.name); target:moveto(place); endfor substitutions {{%targets, $string_utils:english_list(names)}}; announcement $string_utils:substitute(this:message(), substitutions); player.location:announce_all(announcement); endif;五、表达式体系运算符优先级与原子类型MOO 表达式在语法中被组织为经典的层级结构moo.g4expressionlist : expression (COMMA expression)* ; expression : term ((PLUS | MINUS) term)* ; // 加减 term : factor ((TIMES | DIV | MOD) factor)* ; // 乘、除、取模 factor : signedAtom (POW signedAtom)* ; // 幂运算 ^ signedAtom : PLUS signedAtom | MINUS signedAtom | atom ; // 一元正负号atom是表达式的叶子节点覆盖了 MOO 的全部基本值类型atom : stringliteral // 字符串字面量 ... | functioninvocation // 函数调用 name(args) | verbinvocation // 动词调用 obj:verb(...) | property_ // 属性引用支持 . 与 [] 索引 | integer // 整数 | real // 浮点数 | list_ // 列表 { ... } | objref // 对象引用 #123 | ( expression ) | (! expression) // 逻辑非 ;其中属性链property_ : propertyname ((. name) | [ expression ])*支持连续的点号访问与方括号索引如player.location.contents、this.destinations[random($)]、this.bases[random($)]列表字面量list_ : { expressionlist? }支持空列表{}与嵌套列表drone 中substitutions {{%targets, ...}}即为列表套列表对象引用OBJREF : # [0-9]解析#56953这类 MOO 对象编号函数/动词调用functioninvocation形如listappend(targets, candidate)verbinvocation形如player:tell(...)后者由property_ : verb构成verb允许省略参数括号如this:targets_in_room()带空括号、target:moveto(place)带参数。条件表达式则使用relop集合完成关系运算condition : LPAREN expression (relop expression)* RPAREN ; relop : EQ | NEQ | GT | GTE | LT | LTE | AND | OR ;对应词法、!、、、、、、||moo.g4。六、词法规则与空白处理词法部分moo.g4全部使用字面量 token 与字符类定义无内嵌动作Token定义说明OBJREF# [0-9]MOO 对象引用如#78071PERMISSIONS[rcxd]权限位字符串如rc、rxdSTRING[a-zA-Z] [a-zA-Z0-9!_*]标识符/名称支持!、_、*MOO 动词名常见cupc*ake通配写法STRINGLITERAL ~ []* 双引号字符串字面量INTEGER[0-9]整数REAL[0-9] . [0-9]浮点数要求小数点两侧均有数字COMMENT; ~ [\r\n]* - skip分号开头的行注释直接跳过WS[ \r\n\t] - skip空白字符直接跳过值得注意的两点实现细节注释与字符串的歧义规避MOO 中分号;既是语句结束符又是注释起始符语法通过注释 token 定义为;后跟非换行字符并 skip与语句以SEMICOLON结束两条规则分离了两者同时STRINGLITERAL使用~ []*排除双引号保证字符串内部可安全包含;、#等字符如 drone 示例中的注释块;Author: ...与消息文本。名称与关键字的共存name分为username普通STRING与sysname$前缀系统对象两类$不会与STRING冲突因此$string_utils:english_list(names)这类系统函数调用可被正确解析为sysname 动词调用。七、构建与回归测试如何验证语法模块的 pom.xml 提供了开箱即用的 Maven 配置包含两阶段自动化语法生成antlr4-maven-plugin从仓库根目录${basedir}读取 moo.g4同时开启visitor与listener两种遍历方式生成目标代码默认 Java示例回归测试antlr4test-maven-plugin以prog为入口规则、moo为语法名把 examples 目录下的全部示例文件作为输入逐一解析任何解析失败都会使构建失败。仓库根目录的 pom.xml 将 moo 作为子模块纳入可在仓库根执行mvn -pl moo test若要脱离 Maven 手工验证可借助仓库 grun.sh 等脚本工具先生成解析器再对单个示例执行grun moo prog打印语法树由于语法无内嵌 action生成的解析器可原样移植到 desc.xml 列出的任意目标语言CSharp、Cpp、Dart、Go、Java、JavaScript、PHP、Python3、TypeScript、Antlr4ng中使用。八、小结grammars-v4 的 moo 模块用约 390 行的纯 ANTLR4 语法完整覆盖了 MOO 语言的声明命令program/verb/property等 13 类、控制流语句if/while/do/for/try/赋值、运算符优先级明确的表达式体系以及#对象引用、{列表}、$系统对象、rcxd权限等 MOO 特色词法元素。配合 examples 中来自 Rob Myers MOO 代码集的真实程序hello、drone、target、toy、cupcake 等与 pom.xml 的回归测试配置无论是为 MOO 源码构建工具链、移植到新的 ANTLR 目标语言还是学习如何为命令式脚本语言编写无 action 语法这份模块都是可直接参考与运行的范本。赞分享编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载相关推荐基于 ANTLR4 的 CLU 语言语法解析grammars-v4 中 clu 语法的完整实现解析基于 ANTLR4 的 CLU 语言语法解析grammars v4 中 clu 语法的完整实现解析 导读 本文以 grammars v4 仓库中 clu/RE编程语言编译器开发工具DeepTutor开源本地 AI 导师从知识库检索到三层记忆的实践手册DeepTutor开源本地 AI 导师从知识库检索到三层记忆的实践手册 DeepTutor 是一款开源 AI 导师核心定位是以智能体为原生的设计思路把对编程语言编译器开发工具基于 ANTLR4 的 ALPACA 元胞自动机语言文法解析grammars-v4/alpaca 语法实战指南基于 ANTLR4 的 ALPACA 元胞自动机语言文法解析grammars v4/alpaca 语法实战指南 导读 本文面向希望理解并复用 ALPACA 语编程语言编译器开发工具上一篇终极命名指南如何通过A/HC/LC模式提升代码能效与可维护性下一篇Django-Analytical深度集成数据分析的Django应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

项目日报:2026-09-23

项目日报:2026-09-23

一、UI 像素化改造 1. 装备槽改造 装备槽从图标改为文字标签(武器/护甲/头盔/靴子/戒指/项链)移除头盔槽,6 格减为 5 格所有格子圆角统一为 10px 2. 侧边栏导航 侧边栏背景改为透明(去掉方框包裹)导航图标更换为 UI 资…

2026/9/24 16:25:29 阅读更多 →
2026年实测这3个高性价比降AI率软件,毕业论文AI率检测一次过不返工!

2026年实测这3个高性价比降AI率软件,毕业论文AI率检测一次过不返工!

最近辅导学弟学妹写论文,发现一个新情况:大家现在不只是担心查重率高,更怕的是AIGC检测不过关。导师一句“AI痕迹太重”,可能直接让你全文推翻重写。知网、维普的AI检测红线就卡在10%,一旦超标,论文就可能被…

2026/9/24 16:25:29 阅读更多 →
Multi-Loop Collision:当 CI Sweeper 与 PR Babysitter 同时修改同一个 PR——来自 loop-engineering 的真实事故复盘与分支锁解决方案

Multi-Loop Collision:当 CI Sweeper 与 PR Babysitter 同时修改同一个 PR——来自 loop-engineering 的真实事故复盘与分支锁解决方案

人工智能AI AgentAgent 工作流CLI研发协作AI 技能MCP 服务 【免费下载链接】loop-engineering Practical patterns, starters & CLI tools for loop engineering with AI coding agents. Design systems that prompt and orchestrate agents (inspired by Addy Osmani and …

2026/9/24 16:25:29 阅读更多 →

最新新闻

结构可靠性分析:从安全系数到失效概率的定量评估

结构可靠性分析:从安全系数到失效概率的定量评估

在结构设计里,最怕的不是算不准,而是你以为自己算得很准。刚工作那会儿,我按规范给一根简支梁取了安全系数2.5,所有验算都满足,结果现场反馈说梁在使用荷载下挠度偏大,局部焊缝还有开裂迹象。复核时我反复检…

2026/9/24 21:11:15 阅读更多 →
Aider接入自定义API完全指南:DeepSeek/Ollama/OpenAI兼容服务配置与避坑

Aider接入自定义API完全指南:DeepSeek/Ollama/OpenAI兼容服务配置与避坑

如果你手上正好有一把DeepSeek的API Key,又想在终端里享受AI配对编程的体验,那你大概率会搜到Aider。Aider是一个跑在终端里的AI配对编程工具,能读你的git diff、改文件、自动提交,平时我用它处理重构、写测试、清理技术债这些琐碎…

2026/9/24 21:11:15 阅读更多 →
罗汉到家:后端技术栈、架构与后续规划

罗汉到家:后端技术栈、架构与后续规划

罗汉到家:后端技术栈、架构与后续规划文档版本:2026-09-23。项目是可在线演示的上门按摩 O2O 全栈 MVP,不是纯前端 Mock。生产数据由腾讯云 CloudBase 云函数与 PostgreSQL 持久化;本地保留 Express Prisma SQLite 作为类型更完…

2026/9/24 21:11:15 阅读更多 →
Aider自定义API接入指南:终端AI编程与OpenAI兼容模型配置实战

Aider自定义API接入指南:终端AI编程与OpenAI兼容模型配置实战

干这一行时间久了,你会发现真正拉开效率差距的不是手速,而是“改哪里、怎么改”的决策链路有多短。Aider就是在这个痛点里冒出来的工具,一个跑在终端里的AI配对编程助手,不靠IDE插件弹窗,而是在命令行里直接让模型读代…

2026/9/24 21:11:15 阅读更多 →
远程控制电脑全攻略:五大方案对比与跨平台实测

远程控制电脑全攻略:五大方案对比与跨平台实测

远程控制电脑这件事,平时想不起来,一想起就是急事:家里爸妈电脑又弹了一堆窗口,公司电脑还放着没保存的文档,人已经走在路上;或者是实验室里编译到一半,突然被叫走。我这次把市面上最常被问到的…

2026/9/24 21:11:15 阅读更多 →
普朗克尺度:宇宙的元规则与量子引力理论的分水岭

普朗克尺度:宇宙的元规则与量子引力理论的分水岭

在物理学界前沿工作这么久,我一直有一个感觉:大多数人对“创世”的理解还停留在宇宙大爆炸早期的膨胀和粒子汤,很少有人意识到,真正卡住所有理论的关卡,是那一个极其微小的尺度——普朗克尺度。圈量子引力的创始人之一…

2026/9/24 21:10:14 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →