SOURCE

var seq = Parsimmon.seq;
var alt = Parsimmon.alt;
var regex = Parsimmon.regex;
var string = Parsimmon.string;
var optWhitespace = Parsimmon.optWhitespace;
var whitespace = Parsimmon.whitespace;
var lazy = Parsimmon.lazy;

var str = alt(
    regex(/"[^"\\]*(?:\\.[^"\\]*)*"/),
    regex(/'[^'\\]*(?:\\.[^'\\]*)*'/)
);

function opt(parser, empty) {
    if (typeof empty === 'undefined') return parser.or(Parsimmon.succeed([]));
    return parser.or(Parsimmon.succeed(empty));
}

const tag = regex(/[a-zA-Z]/);
const klass = regex(/\.[\w-]+/);

// const pseudoClass = lazy(() => seq(
// 	regex(/:[-\w]+/),
//     opt(
//     	seq(
//         	string('('),
//             opt(
//                 alt(
//                     tag,
//                     klass,
//             		pseudoClass,
//                 ).many()
//             ),
//             string(')')
//         )
//     )
// ).many()).map(node => node);

//const result = pseudoClass.parse(':where(p:not(.class:not(.class)))');
//const result = pseudoClass.parse(':where:where2:where3');
//console.log(result);

const pseudoClass = regex(/:[\w]+/).map(token => ({type: 'pseudo-class', content: token})).many();

console.log(
    pseudoClass.parse(':hover:active').value
)
console 命令行工具 X clear

                    
>
console