Add grammar to depend
This commit is contained in:
parent
5a439be947
commit
9ccaba0b16
6 changed files with 89 additions and 56 deletions
2
Gemfile
2
Gemfile
|
@ -33,6 +33,8 @@ gem 'turbolinks', '~> 5'
|
||||||
gem 'jbuilder', '~> 2.5'
|
gem 'jbuilder', '~> 2.5'
|
||||||
|
|
||||||
gem 'thor'
|
gem 'thor'
|
||||||
|
gem 'rly'
|
||||||
|
gem 'pry'
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
|
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
|
||||||
|
|
|
@ -61,6 +61,7 @@ GEM
|
||||||
xpath (~> 2.0)
|
xpath (~> 2.0)
|
||||||
childprocess (0.7.1)
|
childprocess (0.7.1)
|
||||||
ffi (~> 1.0, >= 1.0.11)
|
ffi (~> 1.0, >= 1.0.11)
|
||||||
|
coderay (1.1.1)
|
||||||
coffee-rails (4.2.2)
|
coffee-rails (4.2.2)
|
||||||
coffee-script (>= 2.2.0)
|
coffee-script (>= 2.2.0)
|
||||||
railties (>= 4.0.0)
|
railties (>= 4.0.0)
|
||||||
|
@ -97,6 +98,10 @@ GEM
|
||||||
nio4r (2.1.0)
|
nio4r (2.1.0)
|
||||||
nokogiri (1.8.0)
|
nokogiri (1.8.0)
|
||||||
mini_portile2 (~> 2.2.0)
|
mini_portile2 (~> 2.2.0)
|
||||||
|
pry (0.10.4)
|
||||||
|
coderay (~> 1.1.0)
|
||||||
|
method_source (~> 0.8.1)
|
||||||
|
slop (~> 3.4)
|
||||||
public_suffix (3.0.0)
|
public_suffix (3.0.0)
|
||||||
puma (3.10.0)
|
puma (3.10.0)
|
||||||
rack (2.0.3)
|
rack (2.0.3)
|
||||||
|
@ -129,6 +134,7 @@ GEM
|
||||||
rb-fsevent (0.10.2)
|
rb-fsevent (0.10.2)
|
||||||
rb-inotify (0.9.10)
|
rb-inotify (0.9.10)
|
||||||
ffi (>= 0.5.0, < 2)
|
ffi (>= 0.5.0, < 2)
|
||||||
|
rly (0.2.3)
|
||||||
ruby_dep (1.5.0)
|
ruby_dep (1.5.0)
|
||||||
rubyzip (1.2.1)
|
rubyzip (1.2.1)
|
||||||
sass (3.5.1)
|
sass (3.5.1)
|
||||||
|
@ -145,6 +151,7 @@ GEM
|
||||||
selenium-webdriver (3.5.1)
|
selenium-webdriver (3.5.1)
|
||||||
childprocess (~> 0.5)
|
childprocess (~> 0.5)
|
||||||
rubyzip (~> 1.0)
|
rubyzip (~> 1.0)
|
||||||
|
slop (3.6.0)
|
||||||
spring (2.0.2)
|
spring (2.0.2)
|
||||||
activesupport (>= 4.2)
|
activesupport (>= 4.2)
|
||||||
spring-watcher-listen (2.0.1)
|
spring-watcher-listen (2.0.1)
|
||||||
|
@ -190,8 +197,10 @@ DEPENDENCIES
|
||||||
jbuilder (~> 2.5)
|
jbuilder (~> 2.5)
|
||||||
listen (>= 3.0.5, < 3.2)
|
listen (>= 3.0.5, < 3.2)
|
||||||
mm2ep_core!
|
mm2ep_core!
|
||||||
|
pry
|
||||||
puma (~> 3.7)
|
puma (~> 3.7)
|
||||||
rails (~> 5.1.2)
|
rails (~> 5.1.2)
|
||||||
|
rly
|
||||||
sass-rails (~> 5.0)
|
sass-rails (~> 5.0)
|
||||||
selenium-webdriver
|
selenium-webdriver
|
||||||
spring
|
spring
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
(truc_bidule = false)
|
( truc_bidule = true )
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
$:.insert(0, 'lib')
|
$:.insert(0, 'lib')
|
||||||
|
|
||||||
require 'thor'
|
require 'thor'
|
||||||
|
require 'rly'
|
||||||
|
require 'pry'
|
||||||
require 'parser.rb'
|
require 'parser.rb'
|
||||||
require 'lexer.rb'
|
require 'lexer.rb'
|
||||||
|
|
||||||
|
@ -12,17 +14,13 @@ module Mm2ep
|
||||||
class ParseCli < Thor
|
class ParseCli < Thor
|
||||||
desc 'parse INFILE', 'Parse INFILE into tokens'
|
desc 'parse INFILE', 'Parse INFILE into tokens'
|
||||||
def parse(infile)
|
def parse(infile)
|
||||||
parser = Parser.new
|
|
||||||
File.open(infile).each_line do |line|
|
File.open(infile).each_line do |line|
|
||||||
parser.parse(line)
|
parser = Parser.new(Lexer.new)
|
||||||
|
token = parser.parse(line.chomp)
|
||||||
|
puts token
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
desc 'lexer ', 'Lexe into tokens'
|
|
||||||
def lexer()
|
|
||||||
truc = Lexer.new
|
|
||||||
truc.validate ['VAR', 'SPACE']
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
33
lib/lexer.rb
33
lib/lexer.rb
|
@ -1,23 +1,24 @@
|
||||||
module Mm2ep
|
module Mm2ep
|
||||||
module Depend
|
module Depend
|
||||||
class Lexer
|
class Lexer < Rly::Lex
|
||||||
attr_reader :expr
|
|
||||||
|
|
||||||
BOOL_EXPR = ['T_BOOL', 'F_BOOL']
|
token :L_PAR, /\(/
|
||||||
START_EXPR = ['VAR', 'BOOL_EXPR','NOT_OP', 'EXPR', 'L_PAR']
|
token :NUMBER, /[0-9]+(\.[0-9]+)?/
|
||||||
|
token :STRING, /"[^"]*"/
|
||||||
|
token :EQ_OP, /\=/
|
||||||
|
token :T_BOOL, /[tT]rue/
|
||||||
|
token :F_BOOL, /[fF]alse/
|
||||||
|
token :VAR, /[a-z][a-zA-Z0-9_]+/
|
||||||
|
token :AND_OP, /AND/
|
||||||
|
token :OR_OP, /OR/
|
||||||
|
token :NOT_OP, /NOT/
|
||||||
|
token :SPACE, /\s+/
|
||||||
|
token :R_PAR, /\)/
|
||||||
|
|
||||||
def initialize
|
on_error do |t|
|
||||||
@expr = []
|
puts "Illegal character #{t.value}"
|
||||||
end
|
t.lexer.pos += 1
|
||||||
|
nil
|
||||||
def validate_space
|
|
||||||
end
|
|
||||||
|
|
||||||
def validate tokens
|
|
||||||
if START_EXPR.include? tokens[0]
|
|
||||||
@expr << tokens[0]
|
|
||||||
tokens = tokens.drop(1)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end # class
|
end # class
|
||||||
|
|
|
@ -1,39 +1,62 @@
|
||||||
module Mm2ep
|
module Mm2ep
|
||||||
module Depend
|
module Depend
|
||||||
class Parser
|
class Parser < Rly::Yacc
|
||||||
attr_reader :tokens
|
|
||||||
|
|
||||||
TOKEN = {
|
rule 'statement : expr' do |st, e|
|
||||||
'L_PAR' => "(",
|
st.value = e.value
|
||||||
'NUMBER' => /[0-9]+(\.[0-9]+)?/,
|
|
||||||
'STRING' => /"[^"]*"/,
|
|
||||||
'EQ_OP' => "=",
|
|
||||||
'T_BOOL' => /[tT]rue/,
|
|
||||||
'F_BOOL' => /[fF]alse/,
|
|
||||||
'VAR' => /[a-z][a-zA-Z0-9_]+/,
|
|
||||||
'AND_OP' => "AND",
|
|
||||||
'OR_OP' => "OR",
|
|
||||||
'NOT_OP' => "NOT",
|
|
||||||
'SPACE' => /\s+/,
|
|
||||||
'R_PAR' => ")"
|
|
||||||
}.freeze
|
|
||||||
|
|
||||||
def initialize
|
|
||||||
@tokens = []
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse s
|
rule 'expr : NOT_OP SPACE expr' do |ex, l, s, e|
|
||||||
s = s.split(' ')
|
ex.value = "#{l.value} #{s.value} #{e.value}"
|
||||||
s.each_with_index do |element, idx|
|
end
|
||||||
TOKEN.each do |token, regex|
|
|
||||||
next if element.sub!(regex, '').nil?
|
rule 'expr : expr SPACE AND_OP SPACE expr' do |ex, l, s, e, sp, r|
|
||||||
@tokens << token
|
ex.value = "#{l.value} #{s.value} #{e.value} #{sp.value} #{r.value}"
|
||||||
break if element.nil?
|
end
|
||||||
end
|
|
||||||
@tokens <<'SPACE' unless idx == s.length-1
|
rule 'expr : expr SPACE OR_OP SPACE expr' do |ex, l, s, e, sp, r|
|
||||||
end
|
ex.value = "#{l.value} #{s.value} #{e.value} #{sp.value} #{r.value}"
|
||||||
puts @tokens
|
end
|
||||||
end # def
|
rule 'expr : L_PAR SPACE expr SPACE R_PAR' do |ex, l, s, e, sp, r|
|
||||||
|
ex.value = "#{l.value} #{s.value} #{e.value} #{sp.value} #{r.value}"
|
||||||
|
end
|
||||||
|
|
||||||
|
rule 'expr : VAR SPACE EQ_OP SPACE F_BOOL' do |ex, v, s, eq, _, n|
|
||||||
|
ex.value = "#{v.value} #{s.value} #{eq.value} #{s.value} #{n.value}"
|
||||||
|
end
|
||||||
|
|
||||||
|
rule 'expr : VAR SPACE EQ_OP SPACE T_BOOL' do |ex, v, s, eq, _, n|
|
||||||
|
ex.value = "#{v.value} #{s.value} #{eq.value} #{s.value} #{n.value}"
|
||||||
|
end
|
||||||
|
|
||||||
|
rule 'expr : VAR SPACE EQ_OP SPACE STRING' do |ex, v, s, eq, _, n|
|
||||||
|
ex.value = "#{v.value} #{s.value} #{eq.value} #{s.value} #{n.value}"
|
||||||
|
end
|
||||||
|
|
||||||
|
rule 'expr : VAR SPACE EQ_OP SPACE NUMBER' do |ex, v, s, eq, _, n|
|
||||||
|
ex.value = "#{v.value} #{s.value} #{eq.value} #{s.value} #{n.value}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# lexer do
|
||||||
|
#
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# def initialize
|
||||||
|
# @tokens = []
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# def parse s
|
||||||
|
# s = s.split(' ')
|
||||||
|
# s.each_with_index do |element, idx|
|
||||||
|
# TOKEN.each do |token, regex|
|
||||||
|
# next if element.sub!(regex, '').nil?
|
||||||
|
# @tokens << token
|
||||||
|
# break if element.nil?
|
||||||
|
# end
|
||||||
|
# @tokens <<'SPACE' unless idx == s.length-1
|
||||||
|
# end
|
||||||
|
# puts @tokens
|
||||||
|
# end # def
|
||||||
|
|
||||||
end # class
|
end # class
|
||||||
end # module
|
end # module
|
||||||
|
|
Loading…
Reference in a new issue