Skip to content

jcon模式 #10

@acodercc

Description

@acodercc

#1 无限重复的匹配

如匹配变量列表int ab,cd,efg;
或者css的declaration列表background:red;color:green;font-size:16px;

主要是利用jcon.or解析器组合子,会返回多个子解析器中最长成功匹配的子解析器。
首先来看int ab,cd,efg;的匹配方式:

var jcon = require('jcon');
var type = jcon.or(jcon.string('int'),jcon.string('double')).setAst('type');  //各种类型
var variable_name = jcon.regex(/[a-zA-Z]\w*/).setAst('variable_name');  //英文字符先导的变量名
var comma = jcon.string(',');
var semicolon = jcon.string(';');

var variable_name_has_comma = jcon.seq(variable_name, comma).noLookhead(semicolon);
var space_list = jcon.regex(/\s/).least(1);
var variable_list = jcon.or(variable_name, variable_name_has_comma).least(1);
var declaration_stmt = jcon.seq(type, space_list, variable_list, semicolon);

console.log( declaration_stmt.parse('int  ab;').ast() );
console.log( declaration_stmt.parse('int  ab,cd;').ast() );
console.log( declaration_stmt.parse('int  ab,;').success );
var variable_list = jcon.or(variable_name, variable_name_has_comma).least(1);

这句实现了最少一个的variable_name的重复,注意jcon.or和jcon.noLookhead的运用:
1 jcon.or组合子将返回最长成功匹配的子解析器,所以ab, cd, 都是variable_name_has_comma进行匹配的。
2 jcon.noLookhead让 ab,; 这种输入串的模式匹配失败,variable_name_has_comma是noLookhead(';')的
#2 skip的运用

skip将会让一个解析器的解析结果不进入seq和times等合并解析结果的解析器组合子的解析结果中

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions