完成了一个层级的匹配
This commit is contained in:
parent
cc2d061d09
commit
6eadee5bd2
@ -11,6 +11,11 @@
|
|||||||
-export([parse/1, parse_file/1]).
|
-export([parse/1, parse_file/1]).
|
||||||
-include("modbus_ast.hrl").
|
-include("modbus_ast.hrl").
|
||||||
|
|
||||||
|
-record(block, {
|
||||||
|
ident :: binary(),
|
||||||
|
props = []
|
||||||
|
}).
|
||||||
|
|
||||||
%% 主解析函数
|
%% 主解析函数
|
||||||
parse(Input) when is_binary(Input) ->
|
parse(Input) when is_binary(Input) ->
|
||||||
Tokens = lexer(Input),
|
Tokens = lexer(Input),
|
||||||
@ -95,19 +100,22 @@ display_tokens(Tokens) ->
|
|||||||
parser_block0([{comment, _, _}|Tokens]) ->
|
parser_block0([{comment, _, _}|Tokens]) ->
|
||||||
parser_block0(Tokens);
|
parser_block0(Tokens);
|
||||||
parser_block0([{ident, _, Ident}, {special, _, ${}|Tokens]) ->
|
parser_block0([{ident, _, Ident}, {special, _, ${}|Tokens]) ->
|
||||||
parser_block0(Tokens, {block, Ident, []}).
|
parser_block0(Tokens, #block{ident = Ident}).
|
||||||
|
%% 这里只是开启了一个新的子元素
|
||||||
|
parser_block0([{ident, _, Ident}, {special, _, ${}|Tokens], B = #block{props = Props}) ->
|
||||||
|
{ResetTokens, B0} = parser_block0(Tokens, #block{ident = Ident, props = []}),
|
||||||
|
parser_block0(ResetTokens, B#block{props = [B0|Props]});
|
||||||
%% 这里很重要,要到Block的关闭字符
|
%% 这里很重要,要到Block的关闭字符
|
||||||
parser_block0([{special, _, $}}|Tokens], B) ->
|
parser_block0([{special, _, $}}|Tokens], B = #block{props = Props}) ->
|
||||||
{Tokens, B};
|
{Tokens, B#block{props = lists:reverse(Props)}};
|
||||||
parser_block0([{special, _, $;}|Tokens], B) ->
|
parser_block0([{special, _, $;}|Tokens], B) ->
|
||||||
parser_block0(Tokens, B);
|
parser_block0(Tokens, B);
|
||||||
%% 处理空的定义
|
%% 处理空的定义
|
||||||
parser_block0([{ident, _, <<>>}|Tokens], B) ->
|
parser_block0([{ident, _, <<>>}|Tokens], B) ->
|
||||||
parser_block0(Tokens, B);
|
parser_block0(Tokens, B);
|
||||||
%% 其他定义,是基于: port /dev/ttyUSB0; 这样的格式的
|
%% 其他定义,是基于: port /dev/ttyUSB0; 这样的格式的
|
||||||
parser_block0([{ident, _Line, Prop}, {special, _, $;}|Tokens], {block, Block, Props}) ->
|
parser_block0([{ident, _Line, Prop}, {special, _, $;}|Tokens], B = #block{props = Props}) ->
|
||||||
parser_block0(Tokens, {block, Block, [Prop|Props]});
|
parser_block0(Tokens, B#block{props = [Prop|Props]});
|
||||||
%% 忽略掉注释信息
|
%% 忽略掉注释信息
|
||||||
parser_block0([{comment, _, _}|Tokens], B) ->
|
parser_block0([{comment, _, _}|Tokens], B) ->
|
||||||
parser_block0(Tokens, B).
|
parser_block0(Tokens, B).
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user