我下载了oracle的免费快速版oracle XE。我在此版本中找不到ProC编译器。我在某个地方读到Oracle 9i客户端有ProC,所以我认为Oracle client for 10g XE也应该有它,并下载了它。但令我失望的是,我在那里找不到它
有没有办法下载旧版oracle 9i并使用它连接到10g XE而不存在任何兼容性问题?。或者可以单独下载Pro*C编译器吗
我不想下载标准版本,因为它们太大(2 GB)。简短回答:对于XE,您需要下载10g客户端并将其安装到新的软件家庭中
背景:
我基本上需要为bibtex文件制作一个编译器,这样就可以查询给定的bibtex数据库。现在我熟悉了理论的某些方面,比如自动机、语法、SLR、LR(1)和LALR解析。然而,我仍然觉得所有这些都是理论和抽象的,因为我从未应用过。
如果有人能概括出构建编译器所需的坚实步骤,那将大有裨益。我可能会使用flex和bison/yacc,所以如果你能让我知道设计过程是如何进行的,在哪个阶段生成什么文件,每个阶段的输出是什么,以及总体上事情是如何联系在一起的,我可能会对事情是如何完成的有一个更实际的看法
谢谢
优先权:
%nonassoc低
%非ASSOC小于等于或等于小于等于运算符
%左op_加op_减
%左运算乘法运算除法
规则:
expr:expr op\u plus expr
|expr op_减去expr
|expr op_乘以expr
|expr op_分区expr
|“~”expr
|打开或关闭
|内华达州
|浮球
;
bool\u expr:expr小于或等于expr
|expr小于expr
|expr等于运算符expr
|非布尔表达式
|正确
|虚假的
表达式:expr%prec l
编译到Arduino平台会不会太费劲
我真的很想用它来做一些“草图”。我会研究一下,因为GCC已经为AVR实现,这个前端应该很容易添加。我经常在FPC AVR端口上工作。当前状态是:可以构建AVR FPC编译器,它可以创建合理的代码,我们正在编写启动代码。在此之后,我们将开始调试简单程序的代码
如果您想使用它,您可以通过以下方式从FPC trunk构建一个avr交叉编译器(不确定它当前是否构建,我们还没有在avr上运行回归测试)
make all OS_TARGET=embedded CPU_T
我正在试着编译OCR0.4,一个谷歌的光学识别程序
如自述文件中所述,他们需要:
1) 确保您已经安装了这些软件包(当前的Ubuntu/Debian)
版本(应适用):
libpng(带标题)
libjpeg(带标题)
libtiff(带标题)
2) 从安装iulib
3) 从Subversion安装tesseract的当前版本
存储库
(http://code.google.com/p/tesseract-ocr)
4) 从发布目录中,运行
/配置
制作
sudo制作安装
我已经完成了上面的所
我没有太多的编译器经验,但我最终不得不写一个。我正在使用FParsec作为解析器,现在正在使用计算器。我(我认为)采取了一种相当典型的方法。我有一个eval函数,它接受一个环境和一个AST节点。环境是一种持久类型,因为它因范围而异。这需要eval,它的助手返回env*node,所有传递的环境都开始变得笨拙
处理这个问题的标准方法是什么?我开始认为拥有一个由每个作用域变异的共享环境会更干净,但如果可能的话,我希望避免这种情况。您可以使用状态单子,作为使用副作用的替代方案,为了避免大多数语法管道。你
我正在用OCaml为一种小型语言编写一个lexer,其语法部分如下:
tab-character = %x0009
eom-character = %x0019
space-character = %x0020
underscore = %x005F
single-quote = %x0027 ; '
我试图在lexer.mll中编写let single_quote=[%x0027],但编译时出现非法字符错误
有人能告诉我如何指定像%x0027这样的数字吗
编译使用语句let single.\
我在搜索Chrome 64位版本,我发现不发布该版本的核心论点是:“现在,它不会给我们带来太多好处。”。(或类似的东西)
我的简单问题是:64位版本的大部分工作不是由编译器完成的吗?。在我看来,“64位版本”是相同的逻辑,使用64位CPU寄存器
显然,在将某些软件的32位版本迁移到64位版本的过程中,我遗漏了一些要点,我想知道一些需要研究的核心问题。我怀疑主要的问题是第三方插件/扩展或类似的,但我不是很确定
提前感谢。“MSV\u设置”:{
'msvs_settings': {
'VCCLC
当我想编译支持动态并行的MPI+CUDA混合程序时,我遇到了一个编译问题
dyn_pal.cu的源代码
#include <stdio.h>
#include <cuda.h>
#define N 100
#define M 32
#define K 2
__device__ volatile int vint = 0;
__global__ void entry( volatile int* foo ) {
for (int i = 0; i < N; +
我最近开始学习编程原理。目前有一些概念对我来说是抽象的。
我想知道“机器”在编译方面是什么。或者一个机器的例子也能让我理解这一点。如何理解机器是“它就是它自己”
在这个意义上,其他事物必须立足于“?< p>机器”就是实际的物理计算机。在编译方面:您编写的每一个代码最终都需要编译成机器代码。更准确地说,它是计算机的微处理器,CPU的所有输入必须是机器语言。当您使用高级语言(C、Java等)编程时,编译器(或虚拟机/仿真器)会为您处理所有机器代码
由于CPU是进行所有计算和程序执行的一个工具,它和它
在编译设计中,人们是否建议创建一个名为“NUMBER”的通用标记类,而不是定义整数、浮点和双精度?我应该等到以后再弄清楚吗?像大多数这样的问题一样,唯一可能的答案是“视情况而定”。但总的来说,除非您在一个单过程解析器中进行直接计算器风格的解释,否则使用多个数字标记类型是不必要的,因为这只会使语法复杂化
有很多脚本语言只有一种类型的数字(awk),因此所有数字标记都在lexer中转换为双精度浮点,根本不需要额外的标记类型
C/C++的lexer需要能够识别“预处理数字”,这是一个包含各种格式的整数
我知道可以使用objdump转储elf文件
但我不知道转储文件转换为so文件
可能吗
最后,我想在so文件中进行模糊处理。所以我想,请按照步骤来做
1.在so文件中生成基本块
2.对基本块进行模糊处理
3.重新制作so文件
这是可能的步骤吗 我认为ELF文件没有任何关于基本块的信息。执行或调试不需要此信息,也没有理由将其保存在输出中。您的问题非常不清楚,但最有可能的答案是“不,不可能”。
假设我有这样的语法:
S -> A C x | u B A
A -> z A y | S u | ε
B -> C x | y B u
C -> B w B | w A
这个语法显然不是LL(1),我可以找到它来构造解析表。但是,如果不使用经典方法,即不构建解析表或不发现任何冲突,我是否可以证明这种语法不是LL(1)
另外,如何将此语法转换为LL(1)?我想我必须同时使用ε求导消去法和左递归消去法,但这有点棘手,而且我多次尝试都无法将其转换为LL(1)
提前谢谢。这两个
假设我有一些代码的中间表示:
t1 = 1
t2 = 2
t3 = 3
t4 = t1 + t2
t5 = t3 + t4
use t5
最终目标是只使用两个ARM寄存器进行寄存器分配,r0和r1,并可能溢出一些符号
第一步是计算每个指令的活动范围:
t1 = 1 |
t2 = 2 | t1
t3 = 3 | t1, t2
t4 = t1 + t2 | t1, t2, t3 (this is going to become a problem)
t5
受Eric Sink在stackoverflow播客上的采访启发,我想在业余时间为学习体验构建一个完整的编译器。我最初的想法是构建一个C编译器,但我不确定这是否会花费太多时间
我想知道是否有一种更小的通用语言更适合作为第一个编译器来实现?或者C实现在合理的时间尺度(200小时)上可行吗
我的目的是针对CLR 编写一个方案编译器
请参阅:我的建议是选择您最喜欢的语言。你所学的知识将超过编写它的编译器的难度。通常,< P>无论你选择哪种语言,你都可以考虑编译到中间语言(IL),以共同语言运行时(CL
Fortran->Algol->Cpl->Bcpl->C->C++->Java
似乎每种语言都是建立在祖先语言之上的。
我的问题是:新语言扩展了父语言还是有某种技巧
e、 Java中的g.System.out.print();它实际上是C中的printf(),依此类推(printf在Cpl中实际上是..)
如果是这样的话,这难道不会使每一种语言都变得更慢,需要更多的内存吗?新语言与框架的区别是什么?语言并不慢,[由编译器创建到汇编的]实现速度慢。理论上,你可以拥有一个比PHP编译器慢的C++编译
似乎要在每个新IDE中安装Clojure,我必须完全重新安装它并创建它的副本。运行REPL就像运行一个Java程序
我来自Ruby背景,Ruby程序由Ruby program.rb运行,Ruby是一个从一个地方执行到文件中的程序(我知道这与java、python等的工作方式类似)
clojure“解释器”仅仅是一个编译过的Java文件,它将.clj文件作为参数,并对其进行处理?首先,clojure没有解释器。所有Clojure代码在加载时都编译成JVM字节码。我强调这一点,因为这是我们Cloju
我正在为参加的编译器课程学习上下文无关语法。我试图为函数的签名定义语法。例如:
int a
int b, int c
Object a, Object d
...
我能做到的最接近于这样的事情是:
Params -> Params, Param
| Param
| lambda
Param -> paramType paramName
但这不是我想要的。此语法允许不正确的字符串为,int a。我在这里已经有一段时间了,我想不出更好的方法来纠正语法
我试图理解即时编译/解释,以及即时编译的负责人?我说《及时》有点像回忆录,对吗?因为它重用了它识别为重复的部分的“解决方案”,即机器或字节码 不,那是不对的
让我们看看这些工具在您向它们抛出字节码时会做什么。(非常简单地说)
口译译员
解释器查看字节码,找出他必须执行的操作,然后转到下一个字节码。这非常简单,并且都发生在运行时
AOT编译器
当人们谈论编译器时,通常会提到AOT编译器。当你编译时,他会查看你给他的字节码,并找出他必须生成的国家代码(汇编程序)。因此,当您运行这个nativ代码时,
为了调试sbcl内部,我尝试跟踪sbcl内部包
比如我试过
(trace "SB-IMPL")
这会导致控制堆栈溢出。我尝试更改控件堆栈的大小
启动SBCL时的启动选项,但没有更改
或者,我还尝试使用:(仅代码片段)修改函数
在“仅对属于指定包的符号执行所有符号”下
我仍然得到溢出错误。上面的代码显示绑定堆栈已耗尽
错误。也许有人可以解释如何控制绑定堆栈的大小
或者,如果有人能指出如何改变内部
SBCL函数定义在编译时也可以很好吗?我可以用
在这种情况下,从源代码重新编译SBCL的技巧。我认为
在最近的一个项目中,部分任务是用更现代的web应用程序替换Visual Foxpro应用程序
作为中间步骤,我可能需要运行并修改旧的Foxpro应用程序
Visual Foxpro的最新开发环境或IDE是什么
(我最好的猜测是VisualStudio2005)
Foxpro专家最近在用什么来开发VisualFoxPro应用程序?是VisualFoxPro的最新版本。此产品不再是Visual Studio的一部分。VFP9 Service Pack 2 Build 7423,具体来说。我们只是使用
我正在为我正在编写的编译器实现SSA构造。SSA算法中有一些我不理解的东西(使用和A.W.Appel的《Java中的现代编译器实现》第二版)。如果变量y首次在一条直线控制流路径中定义(并使用),但从未在另一条平行路径中定义,该怎么办。我是否必须在连接点(定义y的块的支配边界)插入φ函数
例如,在块B中有y的第一个定义。我是否必须在块C的开头插入一条带两个操作数(每个传入控制流路径一个操作数)的PHI指令?然后在SSA重命名时:如何命名路径A->C(不是通过B)中从未定义y的操作数
Entry -
任何人都可以提供各自的优点和缺点;静态类型检查和动态类型检查?这个问题在SO中被提到过几次:
静态键入有以下主要好处:
它允许静态(无需运行程序)快速、可靠和自动地检测许多编程错误。这有助于减少bug的数量并减少调试所花费的时间。
类型声明用作自动检查的文档。它们使程序更容易理解和维护。
静态类型可以提高运行时效率。(请注意,Alore运行时目前无法利用类型声明,但将来可能会发生变化。)
动态类型有一组不同的、互补的好处:
动态类型在概念上比静态类型更简单、更容易理解,尤其是在使用强大的容
系统信息
Macosx 10.8.4
Macports 2.2.0
py27-pyqt4@4.10.2_2(活动)
qt4 mac@4.8.5_0(活动)
qscintula@2.7.2_0(活动)
python27@2.7.5_1+通用(主动)
大家好
我收到以下错误消息:
ImportError:没有名为PyQt4.uic.Compiler的模块
尝试使用以下命令安装Ortoisehg时:
sudo pip安装thg mac
我想我已经正确地设置了$PATH。以下是回声输出:
/opt/lo
波斯特谈到试图在Android Studio中切换到ajc编译器,但似乎他从未想出一种方法。还有谁能弄明白这一点吗
我正在为一种以LLVM-IR为目标的玩具语言实现前端编译器,在运行编译的while语句时遇到堆栈溢出:
例如,这段代码应该永远运行,但编译后的版本堆栈在一段时间后溢出
def run(): Void = {
i = 0;
while(true) {
i = i + 1;
}
}
以下是Compled LLVM-IR:
define i32 @run() nounwind ssp {
; i = 0
%i = alloca i32, ali
我制作了一个基本的Groovy AST,如下所示:
BinaryExpression plus = new BinaryExpression(new ConstantExpression(5), new Token(Types.PLUS, "+", 0, 0), new ConstantExpression(100));
我不能100%确定它是否达到我认为的效果,但我无法测试它,因为我不知道如何将其进入编译器的正确阶段。我尝试了一个GroovyShell,但是它需要一个GroovyCodeSo
我试图从书中运行简单的编译器,但有很多错误,我只是写下了书中的代码。我不是flex和bison方面的专家,我试图修复它,但我做不到
我试图运行的,这就是错误
root@Tom:/home/karo/Desktop# bison -dv Simple.y
Simple.y: warning: 39 shift/reduce conflicts [-Wconflicts-sr]
root@Tom:/home/karo/Desktop# gcc -c Simple.tab.c
In file in
我正在寻找一个编译器框架,可以用来为C源代码编写一些代码优化和数据流分析。我知道有LLVM,但我想使用源代码而不是字节码。我在研究LLVM dragonegg,但我不确定使用它实现数据流传递有多容易?A不支持文本源代码(但它是源代码)。它适用于内部表示,例如s。每个编译器都有自己的内部表示,编译器的大部分工作是转换其内部表示
如果您决定使用一个最新版本,您可以使用(或者更痛苦的是,使用您自己的GCC插件)对其进行扩展。当然,您需要详细了解内部表示(Gimple、泛型树)和编译过程
MELT是一种
我需要为内部循环中的if语句生成无分支代码
如果(i!=j)。我不知道如何生成无分支代码
for (int i = start; i < n; i++)
{
results[i] = 999;
for (int j = 0; j < n; j++)
{
if (i != j)
{
d = myfunction(x, y, i, j);
在OCaml源代码4.07中,在键入/typemod.ml,第1452行:
let type_str_item env srem {pstr_loc = loc; pstr_desc = desc} =
我找不到在哪里定义了desc。函数类型结构项在类型结构函数中定义,但描述不是类型结构的参数之一
我在任何地方都找不到它的定义,我要对它进行模式匹配,所以我不能忽略它
如何导航OCaml源代码以查找定义?此代码片段没有使用变量,而是通过模式匹配绑定一个变量。这是一种记录模式,它将变量desc绑定
我正在实现一个类似lisp的方案,它将在某个时刻被编译成某种形式的字节码,可以看到。不幸的是,我把自己编码成了一个小洞,不知道如何走出这个洞。本质上,给定一个看起来像这样的lambda(外部b是故意不使用的):
我的代码生成以下语法树:
[
type: :lambda,
args: [[type: :word, val: 'a'], [type: :word, val: 'b']],
body: [
[
type: :lambda,
args: [[t
我在处理yaac时遇到了一个问题,因为我一直收到这张便条:
1规则永远不会减少。
29转移/减少冲突
那么,有人能帮我解决这个问题吗
这是我正在研究的语法:
%start P
%token DEF IF THEN ELSE WHILE DO FOR
%token Punctuation_element
%token Operator
%token EQL_EQL GREATER_THAN_OR_EQUALS LESS_THAN_OR_EQUALS NOT_EQUALS
%token<sv
。。。一种流行的技巧是使用蹦床。蹦床是一种户外运动
重复调用内部函数的函数。每一次的内在功能
希望尾部调用另一个函数,它不直接调用它,而是简单地调用它
将其标识(如闭合)返回给蹦床,然后蹦床执行以下操作:
自称。这样就避免了无限制的堆栈增长,但降低了一些性能
不可避免地输了,主要是因为蹦床发出的所有叫声都是叫声
到静态未知函数
另一个技巧是亨利·贝克的“切尼在麻省理工学院”
用他的技术,程序首先必须转换为连续传递
样式(CPS),因此将所有调用转换为尾部调用,然后可以
像往常一样编译。在运行时,
我在浏览Erlang编译器源代码时遇到了这个问题
我不太明白。考虑到我5分钟前才意识到有这样的事情)
请原谅我先问,而不是先试图理解它存在的原因
关于这件事有很多疑问,但它相当神秘 Lambda提升用于将闭包转换为纯函数。通过向函数传递额外的参数,可以减少其自由变量的数量。当您将lambda“提升”到越来越高的作用域中时,您将添加参数以适应在该作用域中声明的局部变量(否则将是自由变量)。一旦lambda没有自由变量,它就是一个纯粹的“顶级”函数
当然,你只能这样做,如果你知道所有的lambda的
我想问一下,是否有人能向我解释一下语法定向切线线性码和伴随码的区别
它与使用编译器派生代码有关
我知道它们是在程序中推导数学方程的不同方法,但是,我不知道如何准确地解释它们
提前谢谢
关于。据我所知,自动创建衍生代码的方法只有两种:
正向微分
后向微分
据我所知,后向微分只是学术上的,因为它需要记住在数组中执行的操作,并在最后返回该数组
并解释此数组的内容。
因此(由于解释),这样的代码非常慢
就我所记得的,反向方法与链式规则有关
也可以混合使用这两种方法:
如果您有一段代码:
a=
可能重复:
我想知道是否有任何编程语言或字节码定义(与机器无关)非常容易编写编译器/解析器。理想情况下,语言本身应该具有良好的指定性和强大的功能,并且不需要易于使用。有这样一种编程语言吗 任何汇编语言都很容易编写编译器,因为每条语句都直接翻译成机器指令。(虽然更准确地说,它被称为汇编程序,而不是编译器。)
对于相同的平台独立字节码选项,您可以查看:
-
(未详细说明)
方案非常接近
另一个有趣的选择是Z代码(在许多旧的文本冒险游戏中使用)机器。这种字节码格式有很好的文档记录,它可能是一个非常
编译器如何将二进制代码生成到单独的文件中?
参考GCC源代码中处理此问题的文件将非常有帮助。
我想知道的是编译器(特别是gcc)是如何从ASM生成机器代码的?汇编程序是一个独立的实用程序。您可以在此处找到更多信息:
源代码是binutils包的一部分。你可以在这里找到:回答这个问题需要书,而不仅仅是几行
极短的版本是:
编译器分为两部分:
将特定语言(如C)转换为语法树的前端(表示程序的通用方式)
以及将语法树转换为特定于机器的(X86、ARM等)代码的后端
其中包括几个步骤:
词法分析(将“s
我正在创建一个编译器,遇到了一些文本,其中提出了实现符号表的两种不同方法。对于一个,每个嵌套级别都有一个存储在堆栈上的符号表。对于第二个选项,只有两个符号表,一个符号表用于维护所有条目,另一个用于跟踪主表的更改,以便在通过特定块后知道要删除哪些条目。这些不同实现的优缺点是什么?我确信第一个选项将更快地删除单个块的符号表,但是这会带来一些开销(我不清楚)。第二种显然是资源密集型的,因为要删除包含许多声明的大型块,但它允许在访问变量时有恒定的时间。比较第二种实现的复杂性,而第一种实现几乎只需要推送和
我用它来寻找产生溢出、下溢、不精确结果等的语句
然而,我是否正确地假设编译器可以对我的代码重新排序,而不是实现我真正想要的效果?如果是这样,我将如何在fe*函数周围创建一个“屏障”(标准化方法的加分)?我可以在某个地方放置一个易失性块吗
如果可以的话,我会测试一下,但我不确定如何测试
例如:
void some_function(double d) {
float f;
feclearexcept(FE_ALL_EXCEPT)
f = d; /* will the relevant code
有没有办法在代码中添加内部版本号?(我的意思是编译器/ide/other本身在编译时在代码中添加/维护内部版本号)?我想显示这个构建编号以供查看(从而实现代码的可追溯性)
有人知道如何在keil软件中使用tortoise svn实现吗?您可以让您的Makefile计算构建编号(例如从源代码管理工具),然后使用-D选项将其从Makefile传递给编译器(例如gcc):
然后在源文件中有如下内容:
static const build_number[] = BUILD_NUMBER;
,通过其功
我对编译知之甚少,但我惊讶地发现Julia编译器没有优化几个进程
让我们考虑朱丽亚(这是一个及时编译器),让我们考虑这两个代码,它们本质上是相同的。
n=1
@time for i = 1:10^8 n=n+1 end
elapsed time: 3.535394087 seconds (0 bytes allocated)
n=1
@time n=n+10^8
elapsed time: 6.599e-6 seconds (112 bytes allocated)
为什么现代编译器不能理解
我正在阅读ML中的现代编译器实现,并尝试做编译器项目(tiger语言)
在第五章语义分析中,使用功能数据结构构建符号稳定。因此,insert table key value将返回一个新表,而不是修改现有表,并且在函数返回时保留旧表。因此,当完成类型检查时,符号表仍然为空
我的问题是,这是否意味着符号表纯粹用于类型检查?因为我已经读过这篇文章,它说符号表也将用于代码生成(我还没有走那么远)
如果在语义分析后使用符号表,我应该使用命令式数据结构吗
任何具体的例子都将不胜感激。:) 否。您可能希望它用
最近我了解到,这是一个为WebKit JavaScript引擎创建的非常快速的编译器后端。像它一样快速编译,比LLVM(他们以前使用过)快5倍。我现在正在开发一种AOT编译语言,目前它可以编译成C,但我想我会使用B3,因为编译速度快,而且因为我喜欢它的简单性,它的语义与我正在创建的语言相似,它可能比在C中做堆栈跟踪容易得多(使用#line指令,DWARF符号信息,addr2line),它将是跨平台的(至少声明了x64和ARM).但我只是开始学习B3,有人能讨论一下这个后端是否可以用于编译语言吗?
因为我在谷歌上找不到任何东西,而且我以前从未见过这样的语法
t11 = phi [0: 2:int, 1: t10] #i
t12 = t11 < 70:int
if t12 goto 1 else 2
t2 = t11 / 2:int
t3 = &pow10tab[t11]
t4 = &pow10tab[t2]
t5 = *t4
t6 = t11 - t2
t11=phi[0:2:int,1:t10]#i
t12=t11
我正在努力解决这个冲突,我已经尝试消除exp上的递归,但是由于移位不使用Pontoevig令牌,移位/减少冲突仍然存在
此外,任何减少/减少冲突的建议都将受到赞赏,因为我也在努力解决这些问题
语法部分:
shift/reduce conflict in state [stack: PFamilia TClasse TCid TBlocoIni TCons PTipoPrimitivo TId TAtribuicaoConst TId *] on TPontoEVirg in {
[ PF
至于为什么要这样做,我想是为了加快代码开发速度。我不确定这是否是一个因素,因为它今天已经回到了4MHz z80的时代
我希望其他人会补充意见,因为这是一个有趣的问题。 < P>。没有,没有C或C++的“运行时”,因为它们是完全编译语言。
其他语言也会被解释——本质上,运行时就像处理器中的超级微码一样,用Java、PHP、BASIC或其他语言解释语句,并在运行时将它们转换为机器代码
至于为什么要这样做,我想是为了加快代码开发速度。我不确定这是否是一个因素,因为它今天已经回到了4MHz z80的时代
许多语言支持类型别名。比如说,
// C
typedef oldType newType
// go
type oldType = newType
它是如何在内部实现的?一般来说,每个类型对应于编译器内部类型对象的一个实例。在编译器生成的可执行代码中,该对象是否具有任何类似项将因语言而异。名称将通过符号表别名到类型实例;如果两个名称是同一类型的别名,则它们的符号表条目可能引用相同的内容
通常可以使用类型运算符(如数组维度或结构/元组聚合)从其他类型创建类型,因此类型的名称不一定是简单标识符;它
目前我们正在进行软件现代化项目,我们无法为PL1等过时语言的程序中的每个语句编写语法 如果不花费大量资源,就无法将PL/1编译器二进制代码反向工程为语法
获取PL/1手册(IBM提供)并使用它定义语法
如果您设法开始获取语法,您将发现PL/1非常难解析:它没有关键字。语言中的每个“关键字”也可以用作变量。这是合法的:
IF BEGIN>END*PROCEDURE[PUT] THEN GOTO CALL;
传统的解析器生成器无法处理此问题
您将面临的另一个问题是PL/1的预处理
由于我的代码有点太长,我认为如果有人愿意帮助我并需要代码,发布github链接会更容易:
在cygwin中,我运行以下命令:
bison -d step3.y
flex step3.fl
gcc step3.tab.c lex.yy.c -lfl -o step3
然后会弹出以下错误:
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x0): multiple definition of `CreateTemp'
/tmp/ccfXBuoP.o:lex.yy.c:(.t
上一页 1 2 ...
5 6 7 8 9 10 11 ...
下一页 最后一页 共 50 页