Ну вот такой короче будет типа парсер, точнее вначале я напишу тулсу для описания языком, чтобы вы потом сами смогли если че свои языки влегкую пилить)
AST.token 'dot', '\.'
AST.token 'word', '[$\w]+'
AST.token 'bracket-open', '\['
AST.token 'bracket-close', '\]'
AST.structure 'EXP', 'описание выражений'
AST.structure 'IDENTIFER', '[word]'
AST.structure 'PROP_ACCESS', '[dot][word]'
AST.structure 'DYNAMIC_ACCESS', '[bracket-open] EXP [bracket-close]'
AST.structure 'PATH', 'IDENTIFER (PROP_ACCESS|DYNAMIC_ACCESS)*'
code = 'User.name[user.soname]'
ast = [
{
type: 'PATH'
value: 'User.name[user.soname]'
contents: [
[
{
type: 'IDENTIFER'
value: 'User'
},
{
type: 'PROP_ACCESS'
value: '.name'
contents: [
{
type: 'word'
value: 'name'
}
]
},
{
type: 'DYNAMIC_ACCESS'
value: '[user.soname]'
contents: [
{
type: 'exp'
value: 'user.soname'
contents: [
#...
]
}
]
},
]
]
}
]
Потом напишу язык для описания того как из ast строить выходное дерево, то есть то же самое только в обратную сторону)) и все.
Будетекрасиво описывать в стиле регулярок что ожидаете на входе и как оно должн выводится. Красота??
Таким образом можно будет например написать препроцессор для css или компилятор из С++ в яваскрипт. Все что угодно. Максимум что я НЕ придумал это как задать универсальный формат AST... Языки то разные.