- 浏览: 3052895 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
在ANTLR里一个lexeme真的只能对应一种token?我是没把说明看仔细还是怎样,但是这等号字符(“=”)该如何对应到多个token上呢?我只是想让它既对应“EQ”又对应“AssignementOperator”而已……yacc里可以的嘛
lcc的lexer里,lexer.c的那个static unsigned char map[256]的定义有点意思。看到像是第77行的:
我便湿了啊……
顺带,lexer.c的开头还有这个定义:
lcc的lexer里,lexer.c的那个static unsigned char map[256]的定义有点意思。看到像是第77行的:
/* 101 A */ LETTER|HEX,
我便湿了啊……
顺带,lexer.c的开头还有这个定义:
enum { BLANK=01, NEWLINE=02, LETTER=04, DIGIT=010, HEX=020, OTHER=040 };
评论
4 楼
dohkoos
2008-04-28
不好意思,贴的代码有问题,下面的是正确的
expression
: assignment_expression
| range_expression
;
assignment_expression
: lvalue '=' boolean_expression
| boolean_expression
;
你说的lexeme是指什么?token和token type又是指什么?
这行代码并不能说明lexeme能对应多种token?
我上面贴的代码就可以解决你的问题
看着你说的我觉得你是想有这样的一种表达形式
EQ|ASSIGN: '='
但我想这时不可能的,在词法分析阶段词法分析器怎么可能分辨出对应多个token的lexeme到底属于那个token呢
把顺序反过来'='还是可以解释成EQ的,我上面贴的代码就解释了这一点
BTW:你在写什么语言的分析程序啊
expression
: assignment_expression
| range_expression
;
assignment_expression
: lvalue '=' boolean_expression
| boolean_expression
;
你说的lexeme是指什么?token和token type又是指什么?
引用
/* 101 A */ LETTER|HEX
这行代码并不能说明lexeme能对应多种token?
引用
我想达到的效果是,'='要与其它的assignment operator在某些时候分隔开,而在某些时候又属于同一类。在帖里说的"EQ"并不是“相等性运算符”
我上面贴的代码就可以解决你的问题
引用
等号字符(“=”)该如何对应到多个token
看着你说的我觉得你是想有这样的一种表达形式
EQ|ASSIGN: '='
但我想这时不可能的,在词法分析阶段词法分析器怎么可能分辨出对应多个token的lexeme到底属于那个token呢
引用
EQ : '='
AssignOp : '=' | '+=' | '-=' | '*='
AssignOp : '=' | '+=' | '-=' | '*='
把顺序反过来'='还是可以解释成EQ的,我上面贴的代码就解释了这一点
BTW:你在写什么语言的分析程序啊
3 楼
RednaxelaFX
2008-04-28
但是您给出的例子并没显示一个lexeme对应多种token type,而是显示了'='作为一种token在多条语法中使用而已。
如果照这个例子写的话,'='等literal terminals恐怕都会被ANTLR生成为Txx的token type吧……
我想达到的效果是,'='要与其它的assignment operator在某些时候分隔开,而在某些时候又属于同一类。在帖里说的"EQ"并不是“相等性运算符”,而只是对一个字母给的一个名字(就像对'&&'叫ANDAND)。在很多语法里都会看到类似AndAnd、OrOr、EqEq之类的古怪名称……大概也是偷懒或者顺手就这样写了吧。
主要是在变量声明的地方希望能把'='与复合赋值运算符('+='、'-='……)分隔开:
当然更好的习惯是给那些literals名字,所以会有VAR : 'var'; COLON : ':';之类。
假如在ANTLR里写
那么生成出来的lexer就始终会认为'='是EQ而不是AssignOp。如果把顺序反过来,AssignOp写前面EQ写后面的话,则'='始终不会是EQ。
ANTLR的手册上也写了,一个lexer在对一个lexeme扫描的时候是不会返回多个token的。但一个token只能对应一种token type,所以我囧了……
帖里提到lcc就是因为它那种写法能在返回一个token的时候允许拥有多个token type,例如字符'A'就同时对应LETTER和HEX。
P.S. 对了,刚才忘了说:多谢dohkoos的指点 ^ ^
到您的blog转了圈,看到也有ANTLR相关的帖子,深感欣慰。以后也请多多指教~
如果照这个例子写的话,'='等literal terminals恐怕都会被ANTLR生成为Txx的token type吧……
我想达到的效果是,'='要与其它的assignment operator在某些时候分隔开,而在某些时候又属于同一类。在帖里说的"EQ"并不是“相等性运算符”,而只是对一个字母给的一个名字(就像对'&&'叫ANDAND)。在很多语法里都会看到类似AndAnd、OrOr、EqEq之类的古怪名称……大概也是偷懒或者顺手就这样写了吧。
主要是在变量声明的地方希望能把'='与复合赋值运算符('+='、'-='……)分隔开:
varDecl : 'var' Id ( ':' type )? ( '=' expr )? ;
当然更好的习惯是给那些literals名字,所以会有VAR : 'var'; COLON : ':';之类。
假如在ANTLR里写
EQ : '=' ; AssignOp : '=' | '+=' | '-=' | '*=' //... ;
那么生成出来的lexer就始终会认为'='是EQ而不是AssignOp。如果把顺序反过来,AssignOp写前面EQ写后面的话,则'='始终不会是EQ。
ANTLR的手册上也写了,一个lexer在对一个lexeme扫描的时候是不会返回多个token的。但一个token只能对应一种token type,所以我囧了……
帖里提到lcc就是因为它那种写法能在返回一个token的时候允许拥有多个token type,例如字符'A'就同时对应LETTER和HEX。
P.S. 对了,刚才忘了说:多谢dohkoos的指点 ^ ^
到您的blog转了圈,看到也有ANTLR相关的帖子,深感欣慰。以后也请多多指教~
2 楼
dohkoos
2008-04-27
当然可以对应多种token
expression
: assignment_expression
| boolean_expression
| range_expression
;
assignment_expression
: lvalue '=' boolean_expression
;
boolean_expression
: logical_or_expression
;
range_expression
: initialValue 'to'^ finalValue
;
logical_or_expression
: logical_and_expression ('or'^ logical_and_expression)*
;
logical_and_expression
: equality_expression ('and'^ equality_expression)*
;
equality_expression
: relational_expression (('='|'<>')^ relational_expression)*
;
http://www.dohkoos.name
expression
: assignment_expression
| boolean_expression
| range_expression
;
assignment_expression
: lvalue '=' boolean_expression
;
boolean_expression
: logical_or_expression
;
range_expression
: initialValue 'to'^ finalValue
;
logical_or_expression
: logical_and_expression ('or'^ logical_and_expression)*
;
logical_and_expression
: equality_expression ('and'^ equality_expression)*
;
equality_expression
: relational_expression (('='|'<>')^ relational_expression)*
;
http://www.dohkoos.name
1 楼
lwwin
2008-03-31
这东西很晦涩-v-+??
发表评论
-
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21885之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48397刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ... -
Building Blocks of a JavaScript Engine
2013-05-23 00:49 0sketches of my new book "B ... -
读《JavaScript语言精髓与编程实践(第二版)》
2013-05-21 00:32 02008年逛书店的时候偶 ... -
添加一个bool C1LateInline参数?
2011-11-25 16:03 0之前我试过给Phi加exact_type不行,那如果像C2一样 ... -
别测空循环
2011-06-23 21:56 5266今天有朋友提到一个叫 ReflectASM的库,为Java环境 ... -
javac在编译创建内部类对象时生成的奇怪的getClass()调用是什么?
2011-06-14 22:17 4255有人问下面这段代码里,main()方法里的outer.new ... -
confluence property
2011-06-08 20:41 0http://en.wikipedia.org/wiki/Co ... -
JIT编译找不到类?
2011-05-09 22:28 5206今天开始Sun的老blog真的搬迁了,从blogs.sun.c ... -
几个简答题
2011-01-10 16:08 2458某题目 写道 龙书 写道In addition to a c ... -
循环中的字符串拼接的优化
2010-12-09 20:46 0public class StringConcatDemo { ... -
Velocity模板的编译
2010-11-15 14:49 0http://ecee.colorado.edu/ecen45 ... -
ANTLR里迭代子规则的一个注意点
2010-09-27 15:31 3608这几天在休假在家,有空的时候在用ANTLR 3.2来写D 2. ...
相关推荐
lexeme, 在 ruby 中,编写了一个简单的词法分析器 位名称 一种用于编程和人类语言的简单词汇分析器。安装有两种方法可以以在你的框中获取 lexeme 。 你可以下载源代码,也可以安装 ruby gem 。gem install lexeme...
而词素(Lexeme)作为Token的实体,代表了源代码中连续的一串字符,当它们符合预设的模式后,即可被识别成相应的Token。这些属性信息,在后续的语义分析以及代码生成中扮演着重要角色,比如,标识符的值、类型、作用...
return new Token(TokenType.IDENTIFIER, lexeme); } } else if (ch == '+') { position++; return new Token(TokenType.PLUS, "+"); } else if (ch == '-') { position++; return new Token(TokenType....
首先,词法分析器的工作原理基于正则表达式,它会将源代码字符串分解成一系列的词素(lexeme),这些词素对应于编程语言的关键词、标识符、常量、运算符等。在C++中,我们可以通过自定义类来表示Token,并设计一个...
`Scan.h`定义了两个关键部分:`MAXTOKENLEN`常量,用于限制标记的最大长度,以及`tokenString`数组,用于存储每个标记的词素(lexeme)。`getToken`函数是对外的接口,它负责返回源文件中的下一个标记。 `Scan.c`...
在编程语言中,每个单词都有其对应的词素(lexeme),即源程序中实际出现的字符序列,而Token是词法分析程序产生的抽象符号,它包含了词素的信息并可能附带额外的属性,比如类型、位置等。例如,"pi"在"Const pi=3....
注意:当前,此扩展仅与Wikibase的当前开发版本兼容,即,如果您使用旧的Wikibase版本,则可能无法正常工作。 通过运行composer install安装依赖项。 添加wfLoadExtension( 'WikibaseLexeme' ); 到LocalSettings....
1. 词法分析(lexical analysis):词法分析器读入组成源程序的字符流,并且将它们组成有意义的词素(lexeme)的序列。 2. 语法分析(syntax analysis):语法分析器使用由词法分析器生成的各个词法单元的第一个分量...
“lexeme”指的是源程序中生成一个标记的原始文本片段,而“token”则是词法分析器抽象出来的一个逻辑实体,可以理解为枚举类型,代表从源代码中读取到的特定编程元素。例如,"(137 )" 在词法分析后可能会被识别为一...
WordNet是著名的英语词汇数据库,它将单词组织成网络,其中每个单词(称为"词元"或"lexeme")都是一个网络中的节点,通过语义关系与其他词元相连。JWordNet是一个Java实现的库,它为Java开发者提供了与WordNet交互的...
DOS用户则可在特定渠道找到对应版本。 - **其他平台支持**:除了在Linux中作为标准工具外,Flex还支持多种操作系统,包括Windows、DOS等。此外,Flex还有类似的工具,例如JLex,专为Java设计。 #### 基本概念 - **...
词法分析器的主要任务是对源代码进行预处理,它将源代码按照编程语言的语法规则切分成一个个有意义的单元——词素(lexeme),每个词素由一个标记类型和对应的值组成。例如,"int"是关键字,"main"是标识符,"="是...
Lexeme类则通常代表词元对象,用于存储分词结果中的每个词汇信息,包括词元的文本内容、词性等。 在IKAnalyzer的实现中,用户可以通过IKSegmentation进行自定义配置,如选择分词模式(精确模式、全模式、快速模式等...
首先,编译器从源代码开始,通过词法分析器(lexical analyzer)对输入的字符流进行扫描,将字符组合成有意义的词素(lexeme),生成词法单元(token)。这些词法单元包含了识别符(token-name)和相关属性...
模式(pattern)是产生和识别元素的规则,记号(token)是按照某个模式识别出的元素,单词(lexeme)是被识别出的元素自身的值。 正规式 正规式是描述语言的规则,可以用来描述语言的语法结构。正规式的定义、字符...
- **文档划分**:在建立全文索引之前,需要将文档内容划分为一系列的单词。这一过程中会进行词干抽取以及提取每个词在整个字段中出现的位置信息,即“词位”(lexeme)。然后将这些lexeme存储在一个新的列中,该列...
为了更好地学习这些内容,本篇文章将详细介绍一些编译原理中的核心术语及其含义。 #### 1. 编译器与解释器 - **Compiler(编译器)**:编译器是一种将源代码(通常为高级语言)翻译成目标代码(通常是机器语言或较...
词法分析器的基本要素主要包括记号(Token)、模式(Pattern)和词素(Lexeme)。记号是源代码中具有特定含义的最小语法单元,例如C语言中的关键字、标识符、常量、操作符等。模式是与特定记号相关联的规则,用于...
- **单词(Lexeme)**:被识别出的元素的值(字符串本身),也称为词值。 - **词法分析器的作用与工作方式** - **作用** - 识别记号并交给语法分析器(根据模式识别记号)。 - 滤掉源程序中的无用成分,如注释、...
该存储库包含要与 v2.2 +一起使用的其他数据文件。 与spaCy安装在同一环境中时,此软件包会将每种语言的资源用作入口点,spaCy会在设置Vocab和Lookups时对其进行检查。 随时提交拉取请求以更新数据。 对于与数据,...