Skip to content

Instantly share code, notes, and snippets.

@maehrm
Created June 17, 2018 08:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maehrm/4c9f122316814cf4bf8a5f9a6b6a9db4 to your computer and use it in GitHub Desktop.
Save maehrm/4c9f122316814cf4bf8a5f9a6b6a9db4 to your computer and use it in GitHub Desktop.
コンパイラつく〜ろ〜♪ 3番BNF記法 - pokotyamuさんのメモ帳 http://pokotyamu.hatenablog.com/entry/2015/05/15/005033
# coding: utf-8
#
# <数値> ::= <数字列> | <符号><数字列> | <数字列>.<数字列> | <符号><数字列>.<数字列>
# <数字列> ::= <数字> | <数字列> <数字>
# <数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
# <符号> ::= + | - | ± # ±は省略
class MyNumeric
rule
target : numeric_num { result = 'ok' }
numeric_num : digit_string
| SIGN digit_string
| digit_string '.' digit_string
| SIGN digit_string '.' digit_string # 追加する必要があるのでは?
digit_string : NUMBER
| digit_string NUMBER
end
---- header
require 'strscan'
---- inner
def parse(str)
scanner = StringScanner.new(str)
@q = []
until scanner.eos?
scanner.scan(/\A\s+/) ? nil :
scanner.scan(/\A\d/) ? @q << [:NUMBER, scanner.matched] :
scanner.scan(/\A[+-]/) ? @q << [:SIGN, scanner.matched] :
scanner.scan(/\A\./) ? @q << [scanner.matched, scanner.matched] :
nil
end
pp @q
do_parse
end
def next_token
@q.shift
end
@maehrm
Copy link
Author

maehrm commented Jun 17, 2018

$ racc -g -o numeric_parser.rb my_numeric.y; ruby numeric_parser.rb

123
[[:NUMBER, "1"], [:NUMBER, "2"], [:NUMBER, "3"]]
ok

+123
[[:SIGN, "+"], [:NUMBER, "1"], [:NUMBER, "2"], [:NUMBER, "3"]]
ok

-123
[[:SIGN, "-"], [:NUMBER, "1"], [:NUMBER, "2"], [:NUMBER, "3"]]
ok

1.23
[[:NUMBER, "1"], [".", "."], [:NUMBER, "2"], [:NUMBER, "3"]]
ok

-1.23
[[:SIGN, "-"], [:NUMBER, "1"], [".", "."], [:NUMBER, "2"], [:NUMBER, "3"]]

parse error on value "." (".")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment