什么是句柄?什么是最左素短语?
素短语的概念:它是个短语,并且至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语,所谓最左素短语就是处于句型最左边的素短语。而一个算符优先文法G的任何句型的最左素短语是满足以下条件的最左子串NaNb…NcNdN(N是非终结符,a,b,c,d是终结符)
实例:句型T+T*F+id,求出其语法树,可知,T*F是最左素短语,id也是素短语,但不是最左的
算符优先分析 [上一节] [下一节]
5.2.1 算符优先文法及其优先表构造
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法。
在后面的定义中,a、b代表任意终结符;P、Q、R代表任意非终结符;‘…’代表由终结符和非终结符组成的任意序列,包括空字。
假定G是一个不含e-产生式的算符文法。对于任何一对终结符a、b,我们说:
1. a≖b当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;
2. a⋖b当且仅当G中含有形如P→…aR…的产生式,而Rb…或RQb…;
3. a⋗b当且仅当G中含有形如P→…Rb…的产生式,而R…a或R…aQ。
如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一:
a≖b,a⋖b, a⋗b
则称G是一个算符优先文法。
现在来研究从算符优先文法G构造优先关系表的算法。
通过检查G的每个产生式的每个候选式,可找出所有满足a≖b的终结符对。为了找出所有满足关系⋖和⋗的终结符对,我们首先需要对G的每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
FIRSTVT(P)={a | Pa…或PQa…,aÎVT而QÎVN}
LASTVT(P)={a | P…a或P…aQ,aÎVT而QÎVN}
5.2.2 算符优先分析算法
所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语。所谓最左素短语是指处于句型最左边的那个素短语。如上例,P*P和i是句型P*P+i的素短语,而P*P是它的最左素短语。
现在考虑算符优先文法,我们把句型(括在两个#之间)的一般形式写成:
#N1a1N2a2…NnanNn+1# (5.4)
其中,每个ai都是终结符,Ni是可有可无的非终结符。换言之,句型中含有n个终结符,任何两个终结符之间顶多只有一个非终结符。必须记住,任何算符文法的句型都具有这种形式。我们可以证明如下定理(证明留给有兴趣的读者作练习):
一个算符优先文法G的任何句型(5.4)的最左素短语是满足如下条件的最左子串Njaj…NiaiNi+1,
aj-1⋖aj
aj≖ aj+1,…,ai-1≖ai
ai⋗ai+1
根据这个定理,下面我们讨论算符优先分析算法。为了和定理的叙述相适应,我们现在仅使用一个符号栈S,既用它寄存终结符,也用它寄存非终结符。下面的分析算法是直接根据这个定理构造出来的,其中k代表符号栈S的使用深度。
5.2.3 优先函数
在实际实现算符优先分析算法时,一般不用表5.1这样的优先表,而是用两个优先函数f和g。我们把每个终结符q与两个自然数f(q)和g(q)相对应,使得
若q1⋖q2 则 f(q1)<g(q2)
若q1≖q2 则 f(q1)= g(q2) (5.5)
若q1⋗q2 则 f(q1)>g(q2)
函数f称为入栈优先函数,g称为比较优先函数。使用优先函数有两方面的优点:便于作比较运算,并且节省存储空间,因为优先关系表占用的存储量比较大。其缺点是,原先不存在优先关系的两个终结符,由于与自然数相对应,变成可比较的了。因而,可能会掩盖输入串的某些错误。但是,我们可以通过检查栈顶符号q和输入符号a的具体内容来发现那些原先不可比较的情形。
如果优先函数存在,那么,从优先表构造优先函数的一个简单方法是:
1. 对于每个终结符a(包括#)令其对应两个符号fa和ga,画一张以所有符号fa和ga为结点的方向图,如果a ⋗≖b,那么,就从fa画一箭弧至gb;如果a⋖≖b,就画一条从gb到fa的箭弧。
2. 对每个结点都赋予一个数,此数等于从该结点出发所能到达结点(包括出发结点自身在内)的个数。赋给fa的数作为f(a),赋给gb的数作为g(b)。
3. 检查所构造出来的函数f和g,看它们同原来的关系表是否有矛盾。如果没有矛盾,则f和g就是所要的优先函数。如果有矛盾,那么,就不存在优先函数。
现在必须证明:若a≖b,则f(a)=g(b);若a⋖b,则f(a) g(b)。第一个关系可从函数的构造直接获得。因为,若a≖b,则既有从fa到gb的弧,又有从gb到fa的弧。所以,fa和gb所能到达的结是全同的。至于a⋗b和a⋖b的情形,只须证明其一。如果a⋗b,则有从fa到gb的弧。也就是,gb能到达的任何结fa也能到达。因此,f(a)³ g(b)。我们所需证明的是,在这种情况下,f(a)=g(b)不应成立。我们将指出,如果f(a)=g(b),则根本不存在优先函数。假若f(a)=g(b),那么必有
a⋗b, a1⋖≖b, a1⋗≖b1,…am⋗≖bm, a⋖≖bm
因为对任何优先函数都必须满足(5.5) 所规定的条件,而上面的关系恰恰表明,对任何优先函数f和g来说,必定有
f(a)> g(b)³ f(a1)³ g(b1)³ … ³ f(am)³ g(bm)³ f(a)
从而导致f(a)> f(a),产生矛盾。因此,不存在优先函数f和g。
5.2.4 算符优先分析中的出错处理
5.2.4 算符优先分析中的出错处理
使用算符优先分析法时,可在两种情况下,发现语法错误:
1. 若在栈顶终结符号与下一输入符号之间不存在任何优先关系;
2. 若找到某一“句柄”(此处“句柄”指素短语),但不存在任一产生式,其右部为此“句柄”。
针对上述情况,处理错误的子程序也可分成几类。首先,我们考虑处理类似第2种情况错误的子程序。当发现这种情况时,就应该打印错误信息。子程序要确定该“句柄”与哪个产生式的右部最相似。例如,假定从栈中确定的“句柄”是abc,可是,没有一个产生式,其右部包含a,b,c在一起。此时,可考虑是否删除a,b,c中的一个。例如,假若有一产生式,其右部为aAcB,则可给出错误信息:“非法b”;若另有一产生式,其右部为abdc,则可给出错误信息:“缺少d”。
句柄是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量。
最左素短语是句型中最左边的素短语。素短语是指至少含有一个终结符的短语,并且除自身外,不包含更小的素短语。
句柄并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念。句柄一般是指获取另一个对象的方法一个广义的指针。
它的具体形式可能是一个整数、一个对象或就是一个真实的指针,而它的目的就是建立起与被访问对象之间的唯一的联系。
扩展资料:
句柄在 Windows编程中是一个很重要的概念,在 Windows程序中并不是用物理地址来标识一个内存块、文件、任务或动态装入模块的。相反地,Windows API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
应该明白的是,句柄是一个标识符,是用来标识对象或者项目的。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个Windows函数来获得一个句柄,之后其他的Windows函数就可以使用该句柄,以引用相应的对象。在 Windows编程中会用到大量的句柄。
句柄(Handle)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量。
Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。
最左素短语就是处于句型最左边的素短语的短语。素短语是一个递归的定义,至少含有一个终结符,并且除它自身之外不再含任何更小的素短语。
扩展资料:
句柄的使用
句柄在Windows编程中是一个很重要的概念,在 Windows程序中并不是用物理地址来标识一个内存块、文件、任务或动态装入模块的。相反地,Windows API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
应该明白的是,句柄是一个标识符,是用来标识对象或者项目的。从数据类型上来看它只是一个16位的无符号整数。
应用程序几乎总是通过调用一个Windows函数来获得一个句柄,之后其他的Windows函数就可以使用该句柄,以引用相应的对象。在 Windows编程中会用到大量的句柄。
一个句型的最左直接短语称为该句型的句柄。素短语是这样的一个短语,它至少包含一个终结符并且不包含更小的素短语。
delphi托盘的一个问题
句柄:HANDLE这是一个中文翻译很古怪的字,我刚开始时一直不知道它是什么东东。刚开始学时总想知道一个HANDLE代表一个什么对象,现在我不去理解它是某对象,而就是理解为访问某一个对象的入口,事实上HANDLE大多数时候是一个整数索引(标志该对象在操作系统的某表中的位置,就好像一个数组的下标一样),...
窗口的句柄和窗口上的文本输入框的句柄一样吗?
KillGLWindow() 的工作就是释放 Rendering Context, Device Context 还有 窗口句柄。 我已经加入了很多错误检查, 如果在摧毁窗口过程中出现了任何错误, 都会弹出一个消息对话框来通知你出现了什么错误。 这使得检查程序错误的工作变得容易一些。GLvoid KillGLWindow(GLvoid) \/\/ Properly Kill The Window{在KillGL...
Windows任务管理器中的CPU占用率和物理内存分别是什么意思
◆句柄:用于唯一标识资源(例如文件和注册表项)的值,以便程序可以访问它。是一种指针的指针。◆线程:在运行程序指令的进程中的对象,线程允许在进程中进行并发操作,并使一个进程能在不同处理器上同时运行其程序的不同部分。◆进程:一个可执行程序或一种服务。◆物理内存:电脑的物理内存使用情况 ...
易语言 怎么获得窗口句柄,获得窗口句柄怎么实现在句柄窗口内取得某点...
.版本 2 .局部变量 HWND, 整数型 _启动窗口.标题 = “我是标题”HWND = 寻找顶级窗口_ (0, “我是标题”)信息框 (“FindWindow:” + 到文本 (HWND) + #换行符 + “取窗口句柄:” + 到文本 (_启动窗口.取窗口句柄 ()), 0, )销毁 ()...
c# 已知一个窗体的句柄和名称,如何判断该窗体是正常显示的还是最小化...
[ DllImport( "user32.dll" ) ]public static extern bool IsIconic( IntPtr hWnd );这个windows API是用来判断窗口是否最小化的。
linux列出最大的文件linux最大的文件
FAT32(Windows):支持最大分区128GB,最大文件4GB;HPFS(OS\/2):支持最大分区2TB,最大文件2GB;EXT2和EXT3(Linux):支持最大分区4TB,最大文件2GB。luinux文件名长度?linux文件名最大长度是255个字符 修改linux的最大文件句柄数限制?通过ulimit-n1000就是当前shell用户所有进程最大文件数为...
易语言取子窗体句柄怎么取啊 最好有个例子
如果需要取某个按钮的窗口句柄。就这样写按钮1.取窗口句柄 (),以此内推,需要取什么就把按钮1换成什么.返回值为整数型,可以在编辑框和标签中显示比如:句柄=按钮1.取窗口句柄 ()编辑框1.内容=到文本(句柄)
易语言 怎么获得窗口句柄,获得窗口句柄怎么实现在句柄窗口内取得某点...
.版本 2 .局部变量 HWND,整数型 _启动窗口.标题 = “我是标题”HWND = 寻找顶级窗口_(0,“我是标题”)信息框 (“FindWindow:”+ 到文本 (HWND)+ 换行符 + “取窗口句柄:”+ 到文本 (_启动窗口.取窗口句柄 ()),0,)销毁 ()
按键精灵窗口句柄最小化或后台怎么让它CTRL键?要很快速的不停的按CTR...
Hwnd = Plugin.Window.Foreground()Rem 开始 Call Plugin.Bkgnd.KeyPress(Hwnd, 17)Delay 50 Goto 开始 --- 如果你知道句柄的话,按你提供的来说就是 Rem 开始 Call Plugin.Bkgnd.KeyPress(1313760, 17)Delay 50 Goto 开始 --- 值得一提的是游戏窗口句柄再每次被启动时会随机生成,而就是说,...
Java中对象有什么用?
这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。 (3) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在...
笪饲哌拉:[答案] 算符优先分析 [上一节] [下一节] 5.2.1 算符优先文法及其优先表构造 一个文法,如果它的任一产生式的右部都不含两个相继... 所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语.所谓最左素短语是...
东光县13940282401: 什么是最左素短语? - ?
笪饲哌拉: 素短语的概念:它是个短语,并且至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语,所谓最左素短语就是处于句型最左边的素短语.而一个算符优先文法G的任何句型的最左素短语是满足以下条件的最左子串NaNb…NcNdN(N是非终结符,a,b,c,d是终结符) 实例:句型T+T*F+id,求出其语法树,可知,T*F是最左素短语,id也是素短语,但不是最左的
东光县13940282401: 什么是句柄 - ?
笪饲哌拉: 句柄 译自英文(词义费解). 实际上是某“对象”“东西”(object) 的 ID. 程序里每个句柄 是一个 独一无二的 无符号整数.例如,程序打开一个视窗,这个窗就有一个句柄,要与这个窗打交道,例如,在这个窗里面画东西,在这个窗里面抓取鼠标坐标,就要用这个句柄.如同人名,标识.游戏句柄,就是游戏的 ID,是此游戏,非别的游戏.
东光县13940282401: 句柄是什么 - ?
笪饲哌拉: 句柄就是用来区分各种内存对象的唯一标识符号,是个32位整数.有些是整个系统唯一(如窗口句柄),有些是当前进程或线程中唯一(如线程句柄,全局的有另一个标识符).详细的可分为许多种,都是以H开头的.在VB中使用时全部都用...
东光县13940282401: 编译原理的疑问 - ?
笪饲哌拉: 设文法G的开始符号为S,abc是G的一个句型.如果有句型S *=>aAc,且A +=>b,则称b是句型abc相对于非终结符A的短语.假如A =>b,则称b是句型abc相对于规则A=>b的直接短语.句柄就是句型的最左直接短语.假如一个短语,有且只含有一个非终结符,则称之为素短语;(语法树)最左边的素短语为最左素短语.形式语言里,规范推导是最右开始,则归约是最左开始.短语的特点是由非终结符而来.在算符优先分析里,短语是进行归约的方向.它和常见的中文、英文里所说的短语概念有相似,也有不同.
东光县13940282401: 句柄的概念是什么? - ?
笪饲哌拉: 句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人.从数据类型上来看它只是一个16位的无符号整数.应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象.
东光县13940282401: 什么叫做句柄? - ?
笪饲哌拉: 在Windows 中,句柄是一个系统内部数据结构的引用.例如,当你操作一个窗口,或说是一个Delphi 窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此,你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标,等等.实际上许多Windows API 函数把句柄作为它的第一个参数,如GDI (图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等等,不仅仅局限于窗口函数,.换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等等.
东光县13940282401: 什么是句柄?句柄有什么作用? - ?
笪饲哌拉: 句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等.WINDOWS句柄有点象C语言中的文件句柄. Windows是一个以虚拟内存为基...
东光县13940282401: C#中什么是句柄 - ?
笪饲哌拉: 句柄,就是资源的唯一可辨别标志, 其数据是一个四字节整型,只有当资源在内存中被系统分配过后才产生,例如:应用程序实例是一个资源,当你运行这个程序的时候,操作系统就为实例分配了内存空间,如何让操作系统管理这个对象呢?windows的做法就是发给这个程序实例一个通行证(想像为句柄),实例拿到这个通行证,就可以调用windows的API或其他资源了,就像学生入学,学校给发个通行证,你就可以去食堂,图书馆了,但你不可以随便进出校长办公室,这点跟指针不一样,有了指针,你可以进出任何地方,但句柄是有权限的,这由系统决定. 窗口是一种资源,当窗口被创建后,产生窗口句柄一张图片,在程序中也就是位图句柄