Coco/R快速编译器生成

The Compiler Generator Coco/R 网站:http://ssw.jku.at/Coco/ Coco/R is a compiler generator, which takes an attributed grammar of a source language and generates a scanner and a parser for this language. The scanner works as a determ 阅读详情

Coco/R 更Cool些,Coco/R 使用增强的 EBNF 文法建立递归下降分析的分析器(Recursive Descent Parser)和扫描器(Scanner)。Coco/R 除了提供调用分析器的主程序模块之外,还提供语义(semantic )模块在文法之中调用(如,符号表处理和代码生成器),可以直接在grammer 内写语意动作【用你自己喜欢的语言。俺是中意Delphi】。

Coco/R (Cocol/R) 的输入语言基于属性文法, 属性文法是由Knuth 作为一种上下文无关的形式化语义语言引入的。
最初编译器完成的分析是静态语义分析如(C语言)。它们描述没有给定顺序的符号属性之间的依赖性, 它们包括构造符号表、记录声明中建立的名字的含义、在表达式和语句中进行类型推断和类型检查以及在语言的类型规则作用域内判断它们的正确性。当时的许多编译器都使用这样的静态语义分析。

Coco/R 是对Coco [ReM?89]版本的增强。它们之间的主要不同在于Coco/R 使用了递归下降分析代替表驱动方式的分析。Coco/R 集成扫描器和分析器描述,避免了在创建的部分之间接口的问题。

http://www.ssw.uni-linz.ac.at/coco/是它的主页
之前我第一个版本的 SqlBroker 是用 VB6 手写词法分析和语法分析器的, 感谢老外写的那本编译原理, 之前看国人的教材,愣是看了和没看没什么区别, 到了 Persistore 的时候,决定重写 SqlBroker,因为C#下还是有些从 Java 移植过来的 Parser Generator 的,于是我找啊找,比较了几个,最后选择了 Coco/R,主要原因是它不用引用额外的 DLL,而且语法很易学,例子也够多,SQL 的也有一个,便于我抄袭。

彼时Antlr也看到了,但其语法实在是有点复杂,Options 就一堆,有点晕,现在 Persistore 因为其复杂性已经被我遗弃了,但 SqlBroker 仍然是一个非常有价值的东西被我用到新的持久层--ObjectDataSet上了,因为 Coco/R对LL(K)的冲突解决并不好,必须加入额外的函数进行 nexttoken 读取并处理,所以我现在准备把 SqlBroker 的语法分析使用 Antlr 来实现。

这几天学习了一下 Antlr的语法(有时候想,这种 Parser Generator 真是好,可以实现自编译,像 Coco/R 本身的 grammer 文件的 parse 就是用它自己生成的 Parser去完成的,这样可以一直递归优化),感觉确实很强大,怪不得成了 java 世界里最流行的不二选择,C# 版本也有,不过命令行工具仍然是调用jar来完成的。

Coco/R 虽然不够 Antlr 强大,但它确实有它的独门利器,举个例子:

COMMENTS FROM "/*" TO "*/"
COMMENTS FROM "--" TO eol

IGNORE eol + cr + tab


换成Antlr,就麻烦多了:

protected
ML_COMMENT
  :  "/*"
    (  { LA(2)!='/' }? '*'
    |  '/n' { newline(); }
    |  ~('*'|'/n')
    )*
    "*/"
      { $setType(Token.SKIP); }
  ;

看到没,必须用$setType来标明这个Token不会进入parser,只要碰到符合此条件的,就一律跳过。还有,Coco/R 可以很方便地支持像 python 那种缩进式的语法分析,不过具体如何弄我忘了。Antlr 也有 Python 语法文件,具体如何处理我还不是很清楚。

Coco/R 我用的时间比较长,简单易学,可以很快上手,但对于一些复杂的语法有点力不从心,而 Antlr 很强大,整个社区也很活跃,相比之下,Coco/R 的圈子要小得多,以前我用的一个版本对于 String 的 Scan 会有一个问题,我是发邮件给作者的,不过作者很快就回信了并给出了对应的修复手法,很PF并感谢他。

在初步使用 Antlr 的过程中,碰到一些小麻烦,比如说:
Parser 必须为小写字母开头,Lexer 必须大写开头(不知这样原因何在)
对于参数的定义及初始化,初始化要写在 Assignment 的前面,因为 Assignment 会在 try 内执行的

附上一个简单的 parser (只能处理 select a,b,c....),通过这个例子,我主要是学习了Antlr 的 Lexer 定义,参数使用,基本上对我移植SqlBroker无障碍了。

class SQLParser extends Parser;
options
{
 exportVocab = SQL;
 buildAST = false;
 k = 2;
}
ansisql
  returns [Node parent]
  {parent = new Node();}
  :   
  SELECT fieldlist[parent] EOF
;
 
fieldlist
  [Node parent]
  {Node f = new Node();}
  :
  f = field
  {parent.next = f;}
  (COMMA fieldlist[f])*
;

field
  returns [Node node]
  {node = new Node();}
  :
  id :ID
  {node.value = id.getText();  }
;
coco/r是一个类似于YACC/LEX功能的语言编写工具。
根据例子,对着葫芦画瓢,测试了一个计算器程序。
计算器的ATG:

---------------------------------------------------------------------------------------------------------------
COMPILER calc


CHARACTERS
    digit = "0123456789".
    cr = '/r'.
    ln = '/n'.
    tab = '/t'.

TOKENS
    number=digit{digit}['.'{digit}].

COMMENTS FROM "//" TO cr ln
IGNORE cr+ln+tab

PRODUCTIONS

OPERAND<out double val>
=    (. val=0;.)
(
number (. val = Double.Parse(t.val);
    .)
|"(" EXPR<out val> ")"
).

EXPR10<out double val>
=    (. bool neg=false; .)
    {
        ('-'    (. neg=!neg; .)
        |'+'    (.         .)
        )
    }
    OPERAND<out val> (. if(neg) val*=-1; .)
    .

EXPR09<out double val>
=
    EXPR10<out val>
    {    (. double val2; .)
        ('*'
        EXPR10<out val2> (. val*=val2; .)
        |'/'
        EXPR10<out val2> (. val/=val2; .)
        )
    }
    .

EXPR<out double val>
=
    EXPR09<out val>
    {
        ('+'
        EXPR09<out val2> (. val+=val2; .)
        |'-'
        EXPR09<out val2> (. val-=val2; .)
        )
    }
    .
calc
=
    EXPR<out result>.
END calc.

需要的Ubuntu工具包:
mono-gmcs coco-cs

编译过程:
1、编写ATG文件
2、产生Parser和Scanner文件
cococs -frames /usr/share/coco-cs calc.TAG
3、编写调用程序:

----------------------------
using System;

public class Calc{
    public static void Main(String[] args){
        Parser parser=new Parser(new Scanner("calc.test"));
        parser.Parse();
        Console.WriteLine(parser.result);
    }
}
----------------------------

用mono编译以前,需要手工调节一下Parser.cs的内容:
添加两行:
1、在Parser类里面添加:
public double result=0;
2、在Parser的EXPR方法里面添加:
double val2;

3、用mono编译
gmcs *.cs

4、测试,编写一个calc.test文件,内容譬如
3*12+1

5、运行
mono calc.exe
输出结果:
37

如果测试运算比较复杂,可以用bc来检验一下结果,输入:
less calc.test | bc

应该没有问题。

全部代码下载: 这里

另外mono产生的calc.exe文件,可以直接在有.Net Framework 2.0环境的Windows下面运行。
mono感觉还是非常不错的!赞一个。
COCO数据集高效加载实战:从API安装到PyTorch自定义Dataset实现 本文详细介绍了如何高效加载和使用COCO数据集,从解决COCO API在Windows和Linux上的安装难题,到深入解析其核心读取接口,最终实现一个功能完整的PyTorch自定义Dataset类。内容涵盖数据加载、标注转换、性能优化及常见避坑指南,旨在帮助计算机视觉开发者构建工业级数据管道,将精力聚焦于模型优化。 阅读详情

相关推荐

如何比较两个相关系数的显著性?

当我们计算得到两个相关系数时,我们可能会想要比较它们的显著性,以确定它们之间的差异是否是由随机因素引起的。使用这些方法,我们可以更好地理解和解释两个相关系数之间的差异,并评估其在统计上的显著性。现在,我们可以使用Cocor包中的相关系数比较函数来比较r1和r2的显著性。上述代码将使用Steiger的Z变换方法对r1和r2进行比较,并返回显著性检验的结果。假设我们有两组数据,分别为X和Y,我们计算得到的相关系数分别为r1和r2。下面我将介绍如何使用Cocor包来比较两个相关系数的显著性,并提供相应的源代码。

web_bug407的博客 1130

COCO/R的一个例子(生成中间语言)

摘自COCO/R手册,代码具有启发性 Sources of the Sample CompilerB.1 Taste.ATGCOMPILER Tasteconst int // typesundef = 0, integer = 1, boolean = 2;const int // object kindsvar = 0, proc = 1;public SymbolTable tab;pub...

深未来技术 566

12、编译技术解析与TinyCode语言编译器实现

本文深入探讨了编译技术的核心内容,涵盖解析算法(如CYK、LL和LR)、编译器生成工具Coco/R的使用,以及TinyCode语言翻译器的完整实现过程。文章详细介绍了词法分析、语法分析、中间表示构建与解释执行等关键模块,并通过实际代码示例展示了从语言定义到解释器运行的全过程。同时对解析算法复杂度进行了分析,提出了错误处理优化与语言功能扩展方向,总结了编译器开发的关键步骤,并展望了编译技术在图形绘制、游戏控制、数学计算及未来AI融合中的应用潜力。

quiet的专栏 52

COCO API三分钟极速安装:Windows/Linux/macOS全平台保姆级教程

还在为COCO数据集API安装烦恼?别担心!本文将为你提供最完整的COCO API安装指南,覆盖Matlab、Python、Lua三种语言,支持Windows、Linux、macOS三大系统。读完本文,你将: ✅ 掌握三种语言的COCO API安装方法 ✅ 了解各平台的环境配置要点 ✅ 学会验证安装是否成功 ✅ 获得常见问题解决方案 ## 📦 环境准备 在安装COCO AP

gitblog_00503的博客 1035

Coco/R解析器生成器的深入解析

本文深入探讨了Coco/R解析器生成器的工作原理及其在编译器开发中的应用。通过分析具体的语法规则和动作,展示了如何使用Coco/R来构建一个功能完整的解析器。文章详细解释了语法同步点、错误恢复机制、语义错误处理以及如何与支持模块接口的交互。最终,通过一个案例研究的解析器示例,说明了如何整合扫描器和解析器到一个完整的驱动程序中。...

weixin_32306683的博客 554

构建编译器:Coco/R语法分析器的深入探索

本文介绍了Coco/R工具在语法分析和词法分析器生成中的应用。通过案例研究,展示了如何使用Cocol语言定义文法,并且详细探讨了产生式、标记、字符集、注释和可忽略字符等概念。文章强调了理解Cocol规范语言的重要性,并通过实例说明了如何通过Coco/R生成解析器和扫描器代码。...

weixin_32306683的博客 441

Coco/R Plugin for NetBeans-开源

这个NetBeans插件在NetBeans IDE中增加了对Coco / R的支持。 Coco / R是一个编译器生成器,它采用属性语法,并为语法描述的语言提供扫描程序和解析器。

深入理解编译器生成工具Coco/R的应用案例

本文深入探讨了编译器生成工具Coco/R的应用案例,通过分析其如何处理复杂的C语言声明、生成单地址代码以及从AST生成代码的过程,揭示了编译器设计中的关键技巧和策略。读者将了解到如何利用Coco/R来简化编译器的编写工作,并对编译器的内部工作原理有更深刻的理解。...

weixin_32306683的博客 482

Mask R-CNN环境配置实战:CUDA、PyTorch与torchvision版本对齐指南

实例分割是计算机视觉的核心任务之一,而Mask R-CNN作为经典两阶段模型,其落地高度依赖底层深度学习环境的稳定性与性能。理解CUDA运行时、GPU驱动、PyTorch及torchvision之间的ABI兼容性原理,是保障RoIAlign、FPN等关键算子高效执行的技术前提。版本错配将直接导致CUDA不可用、符号未定义、推理降速甚至段错误等生产级问题。本文聚焦真实工业场景中的环境构建逻辑,覆盖CUDA Toolkit选型依据、PyTorch-torchvision同源编译实践、OpenCV CUDA加速启

weixin_29062823的博客 229

多GPU加速的显著区域检测工具:基于Faster R-CNN与Visual Genome预训练的视觉特征提取包

一套开箱即用的显著区域检测与特征提取工具,底层采用ResNet-101主干的Faster R-CNN架构,专为图像中关键对象和属性区域生成高判别性视觉特征向量。支持10–100个可配置数量的区域输出,每个区域包含边界框坐标、类别标签、置信度分数及对应2048维特征向量,直接适配图像描述生成、视觉问答(VQA)等下游任务的视觉编码需求。内置多GPU并行训练脚本,兼容COCO、Visual Genome、Pascal VOC数据集的加载与预处理逻辑,涵盖RPN、ROI Pooling、Fast R-CNN核心组

efc1234567的博客 224

coco-r-cpp:我的C ++ CocoR编译器生成器镜像

可可/ R 这是C ++的编译器生成器。 要生成二进制文件,请运行 make 可执行文件将在此目录中。 根据需要使用它。 可从Coco / R的原始站点获得文档。

MS COCO与CMU Panoptic数据集:lightweight-human-pose-estimation-3d-demo.pytorch的训练秘籍

lightweight-human-pose-estimation-3d-demo.pytorch是一个基于PyTorch的实时3D多人姿态估计项目,支持Intel OpenVINO™后端实现CPU快速推理。该项目融合了Lightweight OpenPose和单目RGB单 shot 多人3D姿态估计算法,能够检测多达18种关键点的2D和3D坐标,为开发者提供了高效精准的人体姿态分析解决方案。

gitblog_00196的博客 432

Coco/S Parser Generator:基于Coco / R的解析器生成器-开源

Coco / S是一个编译器生成器,它采用纯EBNF语法文件并具有SAX样式回调API。 它是用Java编写的,并针对输入语法所描述的语言生成了Java扫描器(Lexer)和解析器。 Coco / S是Coco / R for Java的2010/11版本的分支。 虽然Coco / R带有属性语法文件,但Coco / S具有回调API。 这具有语法(EBNF)与编译器/解释器之间清晰分离的优势。

快速上手 DynamicHead:Detectron2 环境安装与首个检测模型运行指南

DynamicHead(Dynamic Head)是 CVPR 2021 发表的统一目标检测头框架,它用注意力机制把"尺度感知、空间感知、任务感知"三类能力整合进同一个检测头中,在不增加计算开销的前提下显著提升目标检测精度。本文面向新手,手把手带你完成 Detectron2 环境安装、DynamicHead 编译安装,并成功运行你的第一个检测模型。 --- ## DynamicHead 是什么

gitblog_00280的博客 446

coco/r 的官方资料

想研究编译原理和开发编译器的朋友可以使用,支持生成java、C#、C++ 等分析器代码,包括词法分析和语法分析

simple-compiler:使用CocoR编译器生成器创建的简单编译器前端

简单的编译器 该项目通过对/ easy / grammar和/ hard / grammar文件中指定的语言应用语法定向的翻译来实现简约的编译器。 目标称为简单的汇编语言,称为SLX。 编译器使用Coco / R编译器生成器实现,该生成器在给定属性语法,符号表和代码生成器的情况下,生成带有递归下降解析器的编译器。 通过使用/ easy / tests /和/ hard / tests /中的测试输入文件来测试编译器。 执行 该项目的起点是在/ easy和/ hard文件夹中找到的语法文件。 硬文法是简单文法的扩展,因此,简单文法的所有功能都可以与硬文法一起使用。 创建编译器规范所需的实现步骤: 对LL(1)形式的语法修改 形成Coco / R兼容产品 符号表的设计与实现 类型检查和错误处理 代码生成器的实现 这些部分将在下面更详细地讨论。 对LL(1)形式的语法修改 初始语法需要通过消

Mask R-CNN环境配置实战:CUDA/cuDNN与PyTorch精准匹配指南

Mask R-CNN作为经典实例分割模型,其运行高度依赖底层深度学习环境的严格兼容性。理解CUDA、cuDNN与PyTorch三者间的版本绑定关系,是解决‘torch.cuda.is_available()为False’‘libcudnn.so加载失败’等高频问题的核心原理。这种依赖并非简单安装即可,而是涉及驱动兼容性、路径配置、动态库权限、符号链接完整性等工程细节,直接决定模型能否启用GPU加速。典型应用场景包括高校CV实践教学、边缘设备轻量化验证及科研快速原型开发。本文聚焦matterport/Mask

weixin_32597009的博客 288

保姆级教程:手把手教你给联想System x 3650 M5服务器配置RAID 5并U盘装系统

本文提供联想System x 3650 M5服务器配置RAID 5并U盘安装系统的详细教程,特别适合零基础运维人员。从准备工作、RAID 5配置到U盘引导和系统安装,涵盖全流程关键步骤与常见问题解决方案,帮助用户高效完成服务器部署。

weixin_42535703的博客 358
上一篇: ACIS平台(转)
下一篇: Coco/R快速编译器生成
deepfuture
博客等级 码龄17年 210粉丝 1287原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值