Skip to content

Commit

Permalink
Remove pycache.
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexhuszagh committed Oct 14, 2022
1 parent 4e82da2 commit f74d84b
Show file tree
Hide file tree
Showing 6 changed files with 261 additions and 68 deletions.
Binary file not shown.
9 changes: 3 additions & 6 deletions docker/android/android/make.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,7 @@ def is_dev(self):
def __repr__(self):
return self.contents

class Makefile:
def __init__(self, sections):
self.sections = sections

class Makefile(list):
@staticmethod
def parse(path):
with open(path, 'r') as f:
Expand Down Expand Up @@ -60,7 +57,7 @@ def parse(path):
return Makefile(sections)

def filter_dev(self):
return Makefile([i for i in self.sections if not i.is_dev()])
return Makefile([i for i in self if not i.is_dev()])

def __repr__(self):
return ''.join([str(i) for i in self.sections])
return ''.join([str(i) for i in self])
287 changes: 238 additions & 49 deletions docker/android/android/soong.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
'''

import sly
import sys

# dictionaries got insertion order in 3.6, guaranteed in 3.7
assert sys.version_info >= (3, 6)

# TODO(ahuszagh) Implement...

Expand All @@ -41,15 +45,36 @@
_ESCAPE = r'{_UNICODE}|\\[^\r\n\f0-9a-f]'

class Lexer(sly.Lexer):
tokens = { BOOL, NUMBER, IDENT, STRING }
tokens = {
BOOL,
FLOAT,
INTEGER,
IDENT,
STRING,
LBRACKET,
RBRACKET,
LBRACE,
RBRACE,
COLON,
COMMA,
EQUALS,
}
ignore = ' \t'
literals = { '[', ']', '{', '}', ':', ',', '=' }

# Tokens
# TODO(ahuszagh) Fix...
STRING = fr'"([^\n\r\f\\"]|\\{_NL}|{_ESCAPE})*"'
NUMBER = r'(?:\d+\.\d*)|(?:\.\d+)|(?:\d+)'
FLOAT = r'(?:\d+\.\d*)|(?:\.\d+)'
INTEGER = r'\d+'
BOOL = '(?:true)|(?:false)'
IDENT = r'[a-zA-Z_][a-zA-Z0-9_]*'
LBRACKET = r'\['
RBRACKET = r'\]'
LBRACE = r'\{'
RBRACE = r'\}'
COLON = r':'
COMMA = r','
EQUALS = r'='

@_(r'\n+')
def newline(self, t):
Expand Down Expand Up @@ -82,56 +107,220 @@ class Parser(sly.Parser):
# )
#
def __init__(self):
self.ast = Ast([])

@_('IDENT "=" expr')
def assign(self, p):
import pdb; pdb.set_trace()
self.names[p.NAME] = p.expr
self.ast = Ast()

# @_('expr')
# def statement(self, p):
# print(p.expr)
#
# @_('expr "+" expr')
# def expr(self, p):
# return p.expr0 + p.expr1
# @_('list COMMA basic_type')
# def list(self, p):
# import pdb; pdb.set_trace()
#
# @_('expr "-" expr')
# def expr(self, p):
# return p.expr0 - p.expr1
#
# @_('expr "*" expr')
# def expr(self, p):
# return p.expr0 * p.expr1
#
# @_('expr "/" expr')
# def expr(self, p):
# return p.expr0 / p.expr1
# @_('basic_type COMMA')
# def list(self, p):
# import pdb; pdb.set_trace()

# TODO(ahuszagh) I thought this group worked...

# @_('ident LBRACE map RBRACE')
# def object(self, p):
# return Variable(p[0], p[1])
#
# @_('"-" expr %prec UMINUS')
# def expr(self, p):
# return -p.expr
# def map(self, p):
# pass

@_('variable')
def rule(self, p):
self.ast.append(p[0])

@_('scope')
def rule(self, p):
import pdb; pdb.set_trace()
self.ast.append(p[0])

@_('ident EQUALS expr')
def variable(self, p):
return Variable(p[0], p[1])

@_('ident LBRACE object RBRACE')
def scope(self, p):
return Scope(p[0], Object(p[2]))

@_('ident LBRACE object COMMA RBRACE')
def scope(self, p):
return Scope(p[0], Object(p[2]))

@_('object COMMA pair')
def object(self, p):
return p[0] + [p[2]]

@_('pair')
def object(self, p):
return [p[0]]

@_('ident COLON expr')
def pair(self, p):
return (p[0], p[2])

@_('array')
def expr(self, p):
return Expr(p[0])

@_('basic_type')
def expr(self, p):
return Expr(p[0])

@_('LBRACKET basic_type RBRACKET')
def array(self, p):
return Array([p[1]])

@_('LBRACKET basic_type COMMA RBRACKET')
def array(self, p):
return Array([p[1]])

@_('LBRACKET sequence RBRACKET')
def array(self, p):
return Array(p[1])

@_('LBRACKET sequence COMMA RBRACKET')
def array(self, p):
return Array(p[1])

@_('sequence COMMA basic_type')
def sequence(self, p):
return p[0] + [p[2]]

@_('basic_type COMMA basic_type')
def sequence(self, p):
return [p[0], p[2]]

@_('IDENT')
def ident(self, p):
return Ident(p.IDENT)

@_('STRING')
def basic_type(self, p):
return p.STRING

@_('FLOAT')
def basic_type(self, p):
return Float(p.FLOAT)

@_('INTEGER')
def basic_type(self, p):
return Integer(p.INTEGER)

@_('BOOL')
def basic_type(self, p):
return Bool(p.BOOL)

# @_('LBRACE')
# def lbrace(self, p):
# import pdb; pdb.set_trace()
#
# @_('"(" expr ")"')
# def expr(self, p):
# return p.expr
# @_('RBRACE')
# def rbrace(self, p):
# import pdb; pdb.set_trace()
#
# @_('NUMBER')
# def expr(self, p):
# return p.NUMBER
# @_('COLON')
# def colon(self, p):
# import pdb; pdb.set_trace()
#
# @_('NAME')
# def expr(self, p):
# try:
# return self.names[p.NAME]
# except LookupError:
# print("Undefined name '%s'" % p.NAME)
# return 0

class Ast:
def __init__(self, nodes):
self.nodes = nodes

class Node:
# @_('EQUALS')
# def equals(self, p):
# import pdb; pdb.set_trace()

# TODO(ahuszagh) Restore this
# @_('IDENT "=" expr')
# def assignment(self, p):
# import pdb; pdb.set_trace()
# self.names[p.IDENT] = p.expr

## @_('expr')
## def statement(self, p):
## print(p.expr)
##
## @_('expr "+" expr')
## def expr(self, p):
## return p.expr0 + p.expr1
##
## @_('expr "-" expr')
## def expr(self, p):
## return p.expr0 - p.expr1
##
## @_('expr "*" expr')
## def expr(self, p):
## return p.expr0 * p.expr1
##
## @_('expr "/" expr')
## def expr(self, p):
## return p.expr0 / p.expr1
##
## @_('"-" expr %prec UMINUS')
## def expr(self, p):
## return -p.expr
##
## @_('"(" expr ")"')
## def expr(self, p):
## return p.expr
##
## @_('NUMBER')
## def expr(self, p):
## return p.NUMBER
##
## @_('NAME')
## def expr(self, p):
## try:
## return self.names[p.NAME]
## except LookupError:
## print("Undefined name '%s'" % p.NAME)
## return 0

class Ast(list):
def __repr__(self):
return '\n'.join(self)

class Expr:
def __init__(self, expr):
self.expr = expr

def __repr__(self):
return f'{repr(self.expr)}'

class Variable:
def __init__(self, name, expr):
self.name = name
self.expr = expr

def __repr__(self):
return f'{repr(self.name)} = {repr(self.expr)}'

class Scope:
def __init__(self, name, obj):
self.name = name
self.obj = obj

def __repr__(self):
return f'{repr(self.name)} {repr(self.obj)}'

class Object(dict):
pass

class Array(list):
pass

class Ident(str):
pass

class String(str):
pass

class Float(float):
pass

class Integer(int):
pass

class Bool:
def __init__(self, value=False):
self.value = value

def __bool__(self):
return self.value
Binary file not shown.
24 changes: 12 additions & 12 deletions docker/android/tests/test_make.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,23 @@
PROJECT_DIR = os.path.dirname(TEST_DIR)
sys.path.insert(0, PROJECT_DIR)

from android import make
from android.make import Makefile

def test():
path = os.path.join(TEST_DIR, 'Android.mk')
contents = open(path).read()
makefile = make.Makefile.parse(path)
makefile = Makefile.parse(path)
assert str(makefile) == contents
assert len(makefile.sections) == 6
assert len(makefile) == 6

assert not makefile.sections[0].is_dev()
assert makefile.sections[1].is_dev()
assert makefile.sections[1].is_benchmark()
assert makefile.sections[2].is_dev()
assert makefile.sections[2].is_test()
assert makefile.sections[4].title == 'Other section.'
assert not makefile[0].is_dev()
assert makefile[1].is_dev()
assert makefile[1].is_benchmark()
assert makefile[2].is_dev()
assert makefile[2].is_test()
assert makefile[4].title == 'Other section.'

filtered = makefile.filter_dev()
assert len(filtered.sections) == 2
assert filtered.sections[0].title is None
assert filtered.sections[1].title == 'Other section.'
assert len(filtered) == 2
assert filtered[0].title is None
assert filtered[1].title == 'Other section.'
9 changes: 8 additions & 1 deletion docker/android/tests/test_soong.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,14 @@ def test():
contents = open(path).read()
lexer = soong.Lexer()
tokens = list(lexer.tokenize(contents))
import pdb; pdb.set_trace()
assert (tokens[0].type, tokens[0].value) == ('IDENT', 'sample_array')
assert (tokens[51].type, tokens[51].value) == ('IDENT', 'srcs')
assert (tokens[52].type, tokens[52].value) == ('COLON', ':')
assert (tokens[53].type, tokens[53].value) == ('LBRACKET', '[')
assert (tokens[54].type, tokens[54].value) == ('STRING', '"tree.cc"')

parser = soong.Parser()
result = parser.parse(iter(tokens))

# TODO(ahuszagh) Implement
# makefile = make.Makefile.parse(path)
Expand Down

0 comments on commit f74d84b

Please sign in to comment.