|
- from __future__ import absolute_import
-
- import unittest
- import logging
- import os
- import sys
-
- logging.basicConfig(level=logging.INFO)
-
- from lark.tools.nearley import create_code_for_nearley_grammar
-
- NEARLEY_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), 'nearley'))
- BUILTIN_PATH = os.path.join(NEARLEY_PATH, 'builtin')
-
- class TestNearley(unittest.TestCase):
- def test_css(self):
- css_example_grammar = """
- # http://www.w3.org/TR/css3-color/#colorunits
-
- @builtin "whitespace.ne"
- @builtin "number.ne"
- @builtin "postprocessors.ne"
-
- csscolor -> "#" hexdigit hexdigit hexdigit hexdigit hexdigit hexdigit {%
- function(d) {
- return {
- "r": parseInt(d[1]+d[2], 16),
- "g": parseInt(d[3]+d[4], 16),
- "b": parseInt(d[5]+d[6], 16),
- }
- }
- %}
- | "#" hexdigit hexdigit hexdigit {%
- function(d) {
- return {
- "r": parseInt(d[1]+d[1], 16),
- "g": parseInt(d[2]+d[2], 16),
- "b": parseInt(d[3]+d[3], 16),
- }
- }
- %}
- | "rgb" _ "(" _ colnum _ "," _ colnum _ "," _ colnum _ ")" {% $({"r": 4, "g": 8, "b": 12}) %}
- | "hsl" _ "(" _ colnum _ "," _ colnum _ "," _ colnum _ ")" {% $({"h": 4, "s": 8, "l": 12}) %}
- | "rgba" _ "(" _ colnum _ "," _ colnum _ "," _ colnum _ "," _ decimal _ ")" {% $({"r": 4, "g": 8, "b": 12, "a": 16}) %}
- | "hsla" _ "(" _ colnum _ "," _ colnum _ "," _ colnum _ "," _ decimal _ ")" {% $({"h": 4, "s": 8, "l": 12, "a": 16}) %}
-
- hexdigit -> [a-fA-F0-9]
- colnum -> unsigned_int {% id %} | percentage {%
- function(d) {return Math.floor(d[0]*255); }
- %}
- """
-
- code = create_code_for_nearley_grammar(css_example_grammar, 'csscolor', BUILTIN_PATH, './')
- d = {}
- exec (code, d)
- parse = d['parse']
-
- c = parse('#a199ff')
- assert c['r'] == 161
- assert c['g'] == 153
- assert c['b'] == 255
-
- c = parse('rgb(255, 70%, 3)')
- assert c['r'] == 255
- assert c['g'] == 178
- assert c['b'] == 3
-
- def test_include(self):
- fn = os.path.join(NEARLEY_PATH, 'test/grammars/folder-test.ne')
- with open(fn) as f:
- grammar = f.read()
-
- code = create_code_for_nearley_grammar(grammar, 'main', BUILTIN_PATH, os.path.dirname(fn))
- d = {}
- exec (code, d)
- parse = d['parse']
-
- parse('a')
- parse('b')
-
-
- if __name__ == '__main__':
- unittest.main()
|