mirror of
https://github.com/AdaCore/langkit.git
synced 2026-02-12 12:28:12 -08:00
67 lines
1.1 KiB
Python
67 lines
1.1 KiB
Python
"""
|
|
Test that a custom rule can be used to parse an analysis unit.
|
|
"""
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
|
|
from langkit.dsl import ASTNode, Field, abstract
|
|
from langkit.parsers import Grammar, List, Opt, Or
|
|
|
|
from lexer_example import Token
|
|
from utils import build_and_run
|
|
|
|
|
|
class FooNode(ASTNode):
|
|
pass
|
|
|
|
|
|
class Name(FooNode):
|
|
token_node = True
|
|
|
|
|
|
class Def(FooNode):
|
|
name = Field()
|
|
args = Field()
|
|
expr = Field()
|
|
|
|
|
|
@abstract
|
|
class Expr(FooNode):
|
|
pass
|
|
|
|
|
|
class Literal(Expr):
|
|
token_node = True
|
|
|
|
|
|
class Ref(Expr):
|
|
name = Field()
|
|
|
|
|
|
class ParentExpr(Expr):
|
|
expr = Field()
|
|
|
|
|
|
class Plus(Expr):
|
|
lhs = Field()
|
|
rhs = Field()
|
|
|
|
|
|
g = Grammar('main_rule')
|
|
g.add_rules(
|
|
main_rule=List(g.def_rule),
|
|
|
|
name=Name(Token.Identifier),
|
|
|
|
def_rule=Def('def', g.name,
|
|
Opt('(', List(g.name, sep=','), ')'),
|
|
'=', g.expr),
|
|
|
|
expr=Or(Plus(g.expr, '+', g.expr),
|
|
ParentExpr('(', g.expr, ')'),
|
|
Ref(g.name),
|
|
Literal(Token.Number))
|
|
)
|
|
build_and_run(g, 'main.py', generate_unparser=True)
|
|
print('Done')
|