ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MOO 编程语言 ANTLR4 语法解析:grammars-v4 中的 moo 语法工程实战指南

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),仅供参考
返回列表