- 浏览: 3048140 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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生成的.tokens文件重格式化(C++版)
将ANTLR生成的.tokens文件重格式化(C#版)
ANTLR在对.g的语法文件生成Java代码的同时,还会生成一个.tokens文件来方便别的parser(例如说接在source parser后的tree parser)使用同样的token定义。
不过这tokens文件看起来不总是那么方便。举例来说,昨天发的帖里Dolphin.g,对应的Dolphin.tokens文件如下:
Dolphin.tokens:
当我知道期望的token类型的名字时,上面的tokens文件可以帮我找到对应的数值常量;但当我在Eclipse里调试时,看到的只有"type",也就是token类型对应的数值常量,要找对应的名字就比较麻烦了。上上下下看得眼花。
于是我自然希望顺序能颠倒一下,数值常量在前,名字在后,并且按照数值常量的大小按升序排序。像这样:
Dolphin.tokens.txt:
这种苦力事情显然不值得开动笨重的Java或者C#,哦别提C++和C了。这个时候最能让我偷懒的办法就是最好的办法 XD
于是写了这样的一段Ruby脚本:
reformat.rb:
好吧,这段代码一点也不美。要是能把读写文件放在同一个循环里,顺带能排序就好了。这段代码仅有的好处就是没花多少时间去写而且功能符合我的需要,以后还可以继续用。
Ruby才刚开始用,希望有高手能指点指点怎么改进一下这代码~~
(20080328更新:加入了下面的版本的代码。避免在传给sort_by的block中使用正则表达式。虽然在循环里用了to_i还是稍嫌不爽)
(20080329更新:发觉应该用Enumerable#grep的。也不用在sort_by的block里用to_i了。很好,更简洁了)
(20080626更新:File.open还是用带block的方式好。IO对象不关掉始终是不放心。另外,原本定义了一个类当作tuple用,想想其实没必要定义个类,直接用数组就够了)
reformat.rb:
(20100812更新:
当初写的Ruby跟现在写的Ruby果然还是比较不一样……)
本来还是写ARGV比较好,不过能凑出(*$*)这么可爱的表情实在是忍不住想把ARGV写成$*啊 =_=|||
====================================================================
P.S. 当然这东西不用Ruby还有更快的实现方法,直接用UltraEdit就行。
首先确保UltraEdit的Advanced->Configuration->Search->Regular Expression Engine里,"Perl compatible Regular Expressions"打上了钩。(我不熟悉UE自己定义的Regex的规格,试了好几次都不行,放弃了,换回相对熟悉些的Perl系Regex)
然后Ctrl+R(或者Search->Replace),在Find What里输入
在Replace With里输入
接着File->Sort->Advanced Sort/Options...,选Numeric Sort,完事。
将ANTLR生成的.tokens文件重格式化(C++版)
将ANTLR生成的.tokens文件重格式化(C#版)
ANTLR在对.g的语法文件生成Java代码的同时,还会生成一个.tokens文件来方便别的parser(例如说接在source parser后的tree parser)使用同样的token定义。
不过这tokens文件看起来不总是那么方便。举例来说,昨天发的帖里Dolphin.g,对应的Dolphin.tokens文件如下:
Dolphin.tokens:
FUNCTION=4 NullLiteral=31 WHILE=18 FloatTypeSuffix=38 OctalLiteral=33 CharacterLiteral=28 LBRACE=11 LineComment=44 FOR=19 DO=17 Exponent=37 RelationalOperator=24 HexDigit=35 BREAK=20 Identifier=5 LPAREN=6 IF=16 AssignmentOperator=15 RPAREN=7 CONTINUE=21 Comment=43 COMMA=8 AddOperator=25 RETURN=22 TypeSpecifier=10 VAR=13 HexLiteral=32 RBRACE=12 IntegerTypeSuffix=36 SEMICOLON=14 DecimalLiteral=34 AssignmentShorthandOperator=23 COLON=9 StringLiteral=29 WS=42 UnicodeEscape=40 FloatingPointLiteral=27 MulOperator=26 EscapeSequence=39 OctalEscape=41 BooleanLiteral=30
当我知道期望的token类型的名字时,上面的tokens文件可以帮我找到对应的数值常量;但当我在Eclipse里调试时,看到的只有"type",也就是token类型对应的数值常量,要找对应的名字就比较麻烦了。上上下下看得眼花。
于是我自然希望顺序能颠倒一下,数值常量在前,名字在后,并且按照数值常量的大小按升序排序。像这样:
Dolphin.tokens.txt:
4=FUNCTION 5=Identifier 6=LPAREN 7=RPAREN 8=COMMA 9=COLON 10=TypeSpecifier 11=LBRACE 12=RBRACE 13=VAR 14=SEMICOLON 15=AssignmentOperator 16=IF 17=DO 18=WHILE 19=FOR 20=BREAK 21=CONTINUE 22=RETURN 23=AssignmentShorthandOperator 24=RelationalOperator 25=AddOperator 26=MulOperator 27=FloatingPointLiteral 28=CharacterLiteral 29=StringLiteral 30=BooleanLiteral 31=NullLiteral 32=HexLiteral 33=OctalLiteral 34=DecimalLiteral 35=HexDigit 36=IntegerTypeSuffix 37=Exponent 38=FloatTypeSuffix 39=EscapeSequence 40=UnicodeEscape 41=OctalEscape 42=WS 43=Comment 44=LineComment
这种苦力事情显然不值得开动笨重的Java或者C#,哦别提C++和C了。这个时候最能让我偷懒的办法就是最好的办法 XD
于是写了这样的一段Ruby脚本:
reformat.rb:
#!/usr/bin/env ruby # reformat.rb ## Reformat a token file produced by ANTLR to the format: ## token_number=token_name def reformat( infile, outfile ) lines = [] File.open infile, "r" do |file| file.each do |line| lines << "#{$2}=#{$1}" if line.chomp =~ /^([^=]+)=([0-9]+)$/ end end # yeah, i know this is slow, but we're not # pushing for speed anyway lines = lines.sort_by do |line| line =~ /^[0-9]+/ $&.to_i end File.open outfile, "w" do |file| lines.each { |line| file.puts line } end end if ARGV.size != 2 puts "Usage: #{$0} [token file] [output file]" exit end infile, outfile = ARGV reformat infile, outfile
好吧,这段代码一点也不美。要是能把读写文件放在同一个循环里,顺带能排序就好了。这段代码仅有的好处就是没花多少时间去写而且功能符合我的需要,以后还可以继续用。
Ruby才刚开始用,希望有高手能指点指点怎么改进一下这代码~~
(20080328更新:加入了下面的版本的代码。避免在传给sort_by的block中使用正则表达式。虽然在循环里用了to_i还是稍嫌不爽)
(20080329更新:发觉应该用Enumerable#grep的。也不用在sort_by的block里用to_i了。很好,更简洁了)
(20080626更新:File.open还是用带block的方式好。IO对象不关掉始终是不放心。另外,原本定义了一个类当作tuple用,想想其实没必要定义个类,直接用数组就够了)
reformat.rb:
#!/usr/bin/env ruby # reformat.rb ## Reformat a token file produced by ANTLR to the format: ## token_number=token_name def reformat( infile, outfile ) lines = [] File.open infile, "r" do |file| file.grep /^([^=]+)=([0-9]+)$/ do |line| lines.push [ $1, $2.to_i ] # name, value = $1, $2 end end lines = lines.sort_by { |pair| pair[1] } File.open outfile, "w" do |file| lines.each { |pair| file.puts "#{pair[1]}=#{pair[0]}" } end end if ARGV.size != 2 puts "Usage: #{$0} [token file] [output file]" exit end infile, outfile = ARGV reformat infile, outfile
(20100812更新:
当初写的Ruby跟现在写的Ruby果然还是比较不一样……)
#!/usr/bin/env ruby def reformat(infile, outfile) lines = File.readlines(infile).map {|l| l.chomp.split '='}.sort_by {|l| l.last.to_i} File.open(outfile, 'w') {|f| f.puts lines.map {|l| l.reverse.join('=')}} end $*.size != 2 || reformat(*$*) and puts "Usage: #{$0} [token file] [output file]"
本来还是写ARGV比较好,不过能凑出(*$*)这么可爱的表情实在是忍不住想把ARGV写成$*啊 =_=|||
====================================================================
P.S. 当然这东西不用Ruby还有更快的实现方法,直接用UltraEdit就行。
首先确保UltraEdit的Advanced->Configuration->Search->Regular Expression Engine里,"Perl compatible Regular Expressions"打上了钩。(我不熟悉UE自己定义的Regex的规格,试了好几次都不行,放弃了,换回相对熟悉些的Perl系Regex)
然后Ctrl+R(或者Search->Replace),在Find What里输入
^([^=]+)=([0-9]+)$
在Replace With里输入
\2=\1
接着File->Sort->Advanced Sort/Options...,选Numeric Sort,完事。
发表评论
-
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21489(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
RubyConf notes
2011-11-08 19:10 0symmetric coroutine Fiber#trans ... -
ShanghaiOnRails第八次线下活动——你不需要知道的Ruby实现
2010-11-12 15:39 2841上个月底正好赶上参加了ShanghaiOnRails 第八次线 ... -
JRuby的运行模式
2010-11-01 11:21 0// 老的JRuby还是用org.jruby.evaluato ... -
你不需要知道的Ruby草稿
2010-10-27 11:25 0一些Ruby实现 Ruby 1.8 树遍历解释 Ruby 1 ... -
Ruby里的fiber/coroutine例子
2010-01-26 18:33 0Ruby 1.9开始支持fiber。与“fiber”一词的一般 ... -
JRuby使用技巧收集
2009-12-28 09:35 0java.lang.Thread.new { puts &qu ... -
特殊类型的eigenclass
2009-12-17 03:39 0Fixnum的实例没有eigenclass true、fals ... -
奇怪的参数
2009-12-08 02:25 0默认参数与闭包的组合 真正的问题不是只是默认参数看起来很诡异, ... -
MacRuby的执行模式
2009-12-07 07:41 0mailing-list macruby-devel http ... -
Rubinius的执行模型
2009-12-05 15:22 0Rubinius wants to help YOU make ... -
Ruby 1.8和1.9中String#hash的实现
2009-11-22 18:23 01.8 string.c int rb_str_hash(s ... -
To囧:拿你来测测Watir...
2009-11-21 22:38 3441iaimstar 写道@RednaxelaFX 你最近ruby ... -
[标题党] MagLev中GC类的真相……
2009-11-21 14:46 0注意到本文的标题:我是说“GC类”的真相,不是说GC的真相哦~ ... -
小试rubyzip的一个脚本
2009-11-17 20:42 3455呼,今天开始3天都是新人培训,总算可以抽点时间发一帖。 现在在 ... -
爬一下Google和百度看口碑对它们做的SEO效果如何
2009-11-09 00:27 0#!/usr/bin/env ruby require ... -
把Mechanize的html_parser改回到Hpricot
2009-11-08 14:45 3115记得我最初开始用Nokogir ... -
使用新的RubyInstaller
2009-11-07 02:37 0Hpricot的安装需要编译,需要devkit -
Ruby metaprogramming tech notes
2009-09-28 15:39 0class Builder def self.build ...
相关推荐
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种语言和系统的开发,包括编程语言、配置文件、通信协议等。这...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR4是它的最新版本,它提供了显著的性能提升和许多新特性。这个开源项目“antlr-...
ANTLR( Anatomy of a Little Language Translator)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR主要用于构建语言、工具和框架。从简单的命令行工具到复杂的编程语言,...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于构建语言、工具和框架,如SQL查询解析器、XML处理器、配置文件...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种语言和系统的开发,包括数据库查询解析、配置文件处理、编程...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的开发,它能生成Java、C#、Python...
这些文件包含了词法符号(tokens)和语法规则,允许ANTLR生成对应目标语言的解析器和词法分析器。 PEG(Parsers Expression Grammar)是一种上下文无关的语法表示法,全称为解析表达式语法。与传统的LL或LR解析器...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架。ANTLR生成Java、C#、Python、JavaScript等语言...
- options域:设置ANTLR生成器的选项,如目标语言、编码等。 - lexer和parser规则:定义词法规则和语法规则,每个规则代表一种语言结构。 - parser规则通常用于构建语法树,lexer规则用于生成Token。 - tokens域:可...
ANTLR4(ANother Tool for Language Recognition)是一款强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,如JSON解析器。ANTLR4可以生成Java、C#、...
ANTLR( Anatomy of a Language Parser Generator )是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,如SQL查询解析器、XML处理器、配置文件解析...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,包括SQL解析器、XML处理器以及Java、C#和Python...
最后,`FCmd.tokens`是一个生成的文件,它包含了Antlr为识别的标记分配的唯一整数值。这些值在内部用于快速比较和处理标记。 总的来说,通过Antlr,我们可以高效地解析特定语法格式的命令行,实现自定义的命令行...
ANTLR4 是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于各种编程语言的语法解析,包括但不限于Java、C#、Python、JavaScript等。在这个名为“smt-antlr4-javascript-...
4. **配置文件解析**:ANTLR可以用来解析复杂的配置文件格式,比如JSON、XML等。 5. **自然语言处理**:虽然主要应用于编程语言,但ANTLR也可以扩展用于自然语言处理领域。 #### 六、ANTLR的使用 - **安装**: ...
ANTLR4是一个强大的解析器生成器,广泛用于处理各种语言和格式,包括编程语言、查询语言、配置文件等。这个项目提供了一个很好的实践平台,帮助我们了解编译器设计的基本概念和技术。 首先,ANTLR4(ANother Tool ...
6. `c.grm`: 这可能是描述C语言语法的语法文件,可能使用类似YACC或ANTLR的格式。语法文件定义了C语言的语法规则,用于指导解析过程。 7. `c_parser.h`, `c_main.h`, `c_lexer.h`: 这些是头文件,包含了对应源文件...
通过词法和语法分析,开发者可以实现自定义的代码检查、格式化和转换功能。 6. **自定义解析规则**: 开发者可以根据需求定制词法和语法规则,例如,创建一个新的DSL(Domain Specific Language)或者解析非标准...
在IT行业中,ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。这个“PracticaObligatoria”项目很可能是一个基于ANTLR的编程实践作业,旨在帮助学生深入理解ANTLR的工作原理及其...