使用 ANTLR4 语法解析 Geek Code:grammars-v4 中 geekcode 语法的完整解读
编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载Geek Code 是 1990 年代互联网文化中流行的一种自我介绍编码格式人们用它在一行文本里浓缩自己的外貌、职业、技术偏好、政治立场乃至怪癖程度通常出现在签名档.signature中。本仓库的geekcode目录提供了一个完整的 ANTLR4 文法实现用于词法、语法分析这种极客代码。本文将围绕 geekcode.g4 逐层拆解其文法设计、Token 定义与解析规则并结合 examples 中的真实样本与 pom.xml 的构建配置说明如何生成解析器、运行测试与验证解析树帮助读者在 CSharp、Java、Go、Python3 等目标语言中直接落地使用。背景什么是 Geek CodeGeek Code 诞生于 1990 年代早期由 Robert A. Hayden 提出随后在 Usenet 等社区流行。它使用一系列元组tuple描述个人属性每个元组由类型字母和**强度标记sizing**组成。例如经典的一行GED/J d-- s:: a-- C() ULU P L E---- W(-) ...这段代码表示这是一位GeekGED/J着装风格邋遢d--、体型偏瘦高s:、年龄偏大a--、会 C 和 C 语言C()、使用 Linux 和 ULTRIXULU、精通 PerlP、重度依赖 EmacsL E----等等。本仓库的 geekcode 文法参考了 web.archive.org将这套自描述格式形式化为严格的 ANTLR4 文法使机器可以无歧义地解析 Geek Code 文本。语法文件总览一个无 action 的组合文法geekcode目录采用组合文法combined grammar形式词法规则与语法规则位于同一个 geekcode.g4 文件中且完全遵循本仓库grammars are free of actions的约定——文法中不嵌入任何目标语言代码因此可以直接生成 CSharp、Cpp、Dart、Go、Java、JavaScript、PHP、Python3、TypeScript、Antlr4ng 等目标见 desc.xml 中声明的 targets。文法入口规则为file_file_ : GCODE tuple EOF ;即一个合法的 Geek Code 文本必须以G...开头的身份标识GCODE开始后跟一个或多个元组直到文件结束。入口规则名file_与 pom.xml 中 antlr4test 插件声明的entryPointfile_/entryPoint一一对应是测试驱动生成的入口点。核心语法规则逐层解读元组tupleGeek Code 的基本单位tuple : REFUSE? tupletyepe (sizing | crossover | qualifier)* ;每个元组由三部分组成可选的拒绝标记REFUSE!加在元组前表示拒绝回答该项。例如示例中的!tv、!z即拒绝透露电视观看情况 / 拒绝透露性别取向。元组类型tupletyepe一个字母或字母组合标识属性类别见下文 Token 表。任意组合的修饰符sizing强度标记由一个或多个-、、*组成如、--、***、*等crossover括号包裹的强度标记如()、()用于表达跨类别属性qualifier限定词见下文。sizing 规则定义了四种符号sizing : (- | | *) ;数量不限可以自由组合。在 Geek Code 约定中越多表示对某事物越热衷-越多表示越不感兴趣*表示有但程度说不清?NOKNOWLEDGE表示不知道/不了解$FORLIVING表示以此为生NOTRIGID表示非刻板类型WANNABE表示希望成为。这些语义由 qualifier 规则编码qualifier : NOTRIGID // | WANNABE // | FORLIVING // $ | NOKNOWLEDGE// ? ;crossover跨括号强度crossover : (LPAREN sizing RPAREN) ;用于在括号内附加额外的强度标记例如C()表示C 非常精通精通程度爆表。注意此时内层括号中的()会被解析为 crossover 而不是独立元组因为元组类型必须是字母。元组类型tupletyepe43 种属性枚举tupletyepe 是整个文法中最庞大的规则列举了 Geek Code 支持的全部属性类别。完整清单如下规则名Token含义DRESSd着装风格shapetuples体型特殊子规则AGEa年龄HAIRH发型COMPUTERSC计算机语言能力PERLPPerlEMACSEEmacsWWWWWebUSENETNUsenetUSENET_ORACLEoUsenet OracleKIBOKKibo网络名人梗OS2OOS/2MACINTOSHMMacintoshVMSVVMSPOLITCALSOCIALPS政治立场社会POLITICSECONOMICPE政治立场经济CYPHERPUNKSY密码朋克PGPPGPPGP 使用STARTREKtStar TrekBABYLON55Babylon 5XFILESXX-FilesROLEPLAYINGR角色扮演TELEVISIONtv电视BOOKSb书籍DILBERTDIDilbertDOOMDDoomEDUCATIONe教育程度HOUSEINGh居住状况RELATIONSHIPSr感情状况SEXUy性取向通用SEXMz性取向男SEXFx性取向女LINUXLLinuxGLASSESg眼镜PENSp笔收藏AUTOau汽车WEIRDNESSw怪癖程度VERBAGEv言语啰嗦程度BSD3863BSD/386JEOPARDYjJeopardyMAGICG魔法奇幻BARNEYBBarneyMUSICu音乐FRIENDSfFriendsNUTRITIONn营养注意部分 Token 是多字符的如PGP、tv、PS、PE、DI、au、5、3、U系列而大部分是单字母。ANTRL4 词法规则采用最长匹配优先策略例如输入PGP会匹配多字符 TokenPGP而不是依次拆成PPERL、GMAGIC、PPERL从而保证了歧义的正确消解。shapetuple体型元组的特例shapetuple : s sizing? qualifier* (: sizing? qualifier*)* ;体型元组s是唯一拥有内部结构的元组以s开头可跟可选强度与限定词之后可用冒号:分隔多个子维度。例如示例中的s:表示体型瘦高s偏瘦:且希望更瘦s:表示身材与某个子项:都偏强。冒号后的部分与冒号前遵循同一套 sizing/qualifier 语法。unixtupleUNIX 阵营专用元组unixtuple : UNIX (BSD | U | AIX | SYSV | HPUX | IRIX | OSF1 | SOLARIS | SCO | NEXT | LINUX) ;这是最复杂的元组用于描述 Unix 使用经历。以U开头后跟一个或多个平台代码每个平台都是U 平台字母的多字符 TokenToken含义UBBSDUUULTRIXUAAIXUVSysVUHHP-UXUIIRIXUOOSF/1USSolarisUCSCOUXNeXTULLinux文法注释use U bc UNIX and ULTRIX are both U解释了为何 ULTRIX 使用UU——因为 UNIX 与 ULTRIX 都以 U 开头必须用第二个字母区分。例如示例中的ULU会被解析为UUNIXLLinux... 实际上按文法UL匹配 TokenLINUXL随后U匹配 UNIX sizing整体表示使用 Linux 且程度为 。注意LINUX在 tupletyepe 中也有定义但它同时是 unixtuple 的组成部分二者通过词法 Token 复用实现。词法细节GCODE 与空白处理身份标识规则GCODE定义了 Geek Code 的名片头GCODE : G ALPHA (/ ALPHA)* ;即大写G后跟一个或多个大写字母可用/分隔多个代号。示例中的GED/J、GCS/MC、GLS均匹配此规则代表极客类型ED教育者、CS计算机科学家、LS生活方式等。ALPHA定义为[A-Z]。空白字符通过WS规则直接跳过WS : [ \r\n\t] - skip ;这意味着多个元组之间可以用空格、换行、制表符任意分隔例如 example2.txt 中第二行元组位于独立行解析器不会产生无关 Token。真实示例解析验证examples目录提供了 4 个真实 Geek Code 样本可以逐行验证文法行为example1.txtGED/J d-- s:: a-- C() ULU P ...——完整的经典风格签名包含 sizing、crossover()、qualifier$、unixtupleULU、多字符 Tokentv、DI等几乎所有语法要素。example2.txt含!tv、!z拒绝标记以及PPerl 程度 wannabe 程度 这类 sizingqualifier 混合。example3.txt与 example1 类似的紧凑变体验证O-MV-这类无空格粘连输入也能正确切分 Token。example4.txtGLS d- s: a? C ...其中a?表示年龄AGE配合 NOKNOWLEDGE 限定词R*表示角色扮演程度模糊*s:展示冒号分隔的体型子维度。以P为例按文法tupletyepe (sizing | crossover | qualifier)*解析PPERL→sizing→WANNABE→sizing四个 Token 依序归约无歧义。构建、测试与运行方式Maven 构建配置pom.xml 声明了两个关键插件antlr4-maven-plugin从geekcode.g4生成目标语言的解析器代码并开启visitor与listener两种遍历模式方便后续编写语义处理逻辑。antlr4test-maven-plugincom.khubla.antlr以file_为入口点entryPointfile_/entryPoint、geekcode为文法名自动对 examples 目录下的所有示例文件执行解析测试任何语法错误都会导致构建失败这是仓库 CI 的基础验证手段。本地运行与调试本仓库根目录的 test.sh 与 _scripts/readme.md 描述了通用测试流程。最简单的方式是在geekcode目录下使用 Maven 直接跑测试mvn testantlr4test 插件会逐一解析 examples 中的样本并输出解析树可设置showTreetrue/showTree查看。如果需要交互式调试可先用antlr4工具生成解析器Java 目标再用grungrun.sh查看具体某个样本的解析树grun geekcode file_ examples/example1.txt -tree仓库约定的跨语言测试方式是参见 _scripts/readme.md在geekcode目录下执行bash ../_scripts/test.sh target其中target可取 Cpp、CSharp、Dart、Go、Java、JavaScript、PHP、Python3 等需安装对应语言工具链。该脚本基于 pom.xml 用 trgen 生成指定目标语言的驱动程序再通过 make 完成构建与测试从而保证文法在 desc.xml 声明的全部目标上行为一致。使用场景与扩展建议Geek Code 虽已是历史产物但作为**领域专用小语言DSL**的典型样本本文法依然有实用价值教学示范geekcode.g4短小精悍却覆盖了多字符 Token 消歧、可选前缀!、嵌套结构crossover、shapetuple 的冒号分段、以及枚举 任意长度修饰符这类常见 DSL 模式非常适合作为 ANTLR4 入门教材级案例。解析历史数据如需批量解析 1990 年代 Usenet 归档中的签名档可将此文法生成的解析器嵌入 Java、Go、Python3 等程序对G...开头的行做结构化提取。扩展新属性若想加入 2020 年代的新极客属性如Docker、AI、LLM只需在tupletyepe规则与词法 Token 表中新增条目即可其余规则无需改动。需要注意的是Geek Code 本身存在历史版本的方言差异不同时期对*、?、$的语义解释略有不同本文法以仓库 README 引用的存档文档为准若遇到不符合当前文法定义的旧式写法需要先做归一化预处理。整体而言geekcode是一个麻雀虽小、五脏俱全的 ANTLR4 实战案例无论是学习文法设计还是做数据解析都值得直接取用。赞分享编程语言编译器开发工具【免费下载链接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.项目地址https://gitcode.com/gh_mirrors/gr/grammars-v4点击查看免费下载相关推荐grammars-v4 中的 Amazon States Language 内在函数 ANTLR4 语法从词法到嵌套调用的完整解析grammars v4 中的 Amazon States Language 内在函数 ANTLR4 语法从词法到嵌套调用的完整解析 导读 本文以开源仓库 gr编程语言编译器开发工具MuMath ANTLR4 语法解析指南grammars-v4 中 mumath 文法的结构、规则与实战用法MuMath ANTLR4 语法解析指南grammars v4 中 mumath 文法的结构、规则与实战用法 MuMathmuMATH是 20 世纪 70编程语言编译器开发工具使用 ANTLR4 解析 Acme 架构描述语言grammars-v4 仓库 acme 语法实现全解析使用 ANTLR4 解析 Acme 架构描述语言grammars v4 仓库 acme 语法实现全解析 本文围绕 grammars v4 仓库中的 acme编程语言编译器开发工具上一篇Preact Table 的 AppCell 无选择器 Props 接口全解AppCellPropsWithoutSelector 深入剖析下一篇Polars SQL集成传统SQL与现代DataFrame的完美结合创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考