『Rubyを256倍使うための本 無道編』の 08.noarg/intp.y を移植
未知変数は引数のない関数呼び出しと解釈
#!/usr/bin/env python from math import * def foo(): print "foo" import string import ply.lex as lex tokens = ( 'NUMBER', 'STRING', 'IDENT', # 'EOL', ) literals = "(),=" def t_NUMBER(t): r'\d+' try: t.value = int(t.value) except ValueError: print "Integer value too large", t.value t.value = 0 return t def t_STRING(t): r'"(?:[^"\\]+|\\.)*"' t.value = eval(t.value) return t def t_EOL(t): r'\n' return t t_IDENT = r'[a-zA-Z_]\w*' t_ignore = " \t" def t_error(t): print "Illegal character '%s'" % t.value[0] t.lexer.skip(1) lex.lex() import ply.yacc as yacc def p_program(p): """program : | program stmt""" def p_stmt(p): """stmt : primary | assign""" def p_stmt_IDENT(p): "stmt : IDENT args" p[0] = do_funcall(p[1], p[2]) def p_funcall_args(p): "funcall : IDENT '(' args ')'" p[0] = do_funcall(p[1], p[3]) def p_funcall_no_args(p): "funcall : IDENT '(' ')'" p[0] = do_funcall(p[1], []) def p_args1(p): "args : primary" p[0] = [p[1]] def p_args2(p): "args : args ',' primary" p[1].append(p[3]) p[0] = p[1] def p_assign(p): "assign : IDENT '=' primary" p[0] = do_assign(p[1], p[3]) def p_primary_ident(p): "primary : IDENT" p[0] = do_varref(p[1]) def p_primary_others(p): """primary : NUMBER | STRING | funcall""" p[0] = p[1] def p_error(p): try: print "Syntax error at '%s'" % p.value except AttributeError: print "Syntax error" yacc.yacc() vtable = {} def do_funcall(func, args): cmd_args = string.join([repr(x) for x in args], ",") cmd = func + "(" + cmd_args + ")" cmd_no_paren = func + " " + cmd_args try: return eval(cmd) except SyntaxError: exec(cmd_no_paren) def do_assign(vname, val): global vtable vtable[vname] = val def do_varref(vname): global vtable if vtable.has_key(vname): return vtable[vname] else: eval(vname)() while 1: try: s = raw_input() except EOFError: break if not s: continue yacc.parse(s)
で、
foo foo foo() foo
「yacc: 3 shift/reduce conflicts」が出てしまう
Commons Lang、Validate.isTrue()
import org.apache.commons.lang.Validate; public class C2009050900 { public static void main(String[] args) { Validate.isTrue(true, "foo", 1.2); Validate.isTrue(false, "foo", 1.2); } }
で、
Exception in thread "main" java.lang.IllegalArgumentException: foo1.2 at org.apache.commons.lang.Validate.isTrue(Validate.java:128) at C2009050900.main(C2009050900.java:8)
libharu:HPDFFont#get_ascent
「return NUM2INT(i);」は「return INT2NUM(i);」に修正
#!/usr/bin/env ruby require "hpdf" pdf = HPDFDoc.new page = pdf.add_page font = pdf.get_font("Helvetica", nil) p font.get_ascent pdf.use_jp_fonts pdf.use_jp_encodings font = pdf.get_font("MS-Mincyo", "90ms-RKSJ-H") p font.get_ascent
で、
718 859