javascript - 使用 PEG.js 匹配包含 underscope 的字符串文字

标签 javascript parsing qmake peg pegjs

我正在继续学习 PEG.js,但仍停留在下一期。

PEG.js 生成的解析器无法匹配包含下划线的字符串:

CONFIG += stl_off

成功解析没有它们的字符串:

CONFIG += static

(这是一个内置变量CONFIG“appending-assignment”语句,rvalue是一组有限的字符串列表)

我做错了什么?


语法:

Start =
    Statement* {return env; }

Statement
    = Comment
    / GenericAssignmentStatementT

GenericAssignmentStatementT = Whitespace* GenericAssignmentStatement Whitespace*
GenericAssignmentStatement
    // TEMPLATE
    = TemplateAssignmentStatement
    // CONFIG
    / ConfigAssignmentStatement
    / ConfigAppendingAssignmentStatement

// -------------------------------------------------------------------------------------------------

// # Single-line comment
Comment "Comment string" = Whitespace* "#" rvalue:$(!LineBreak .)* LineBreak+ {
    return "#" + rvalue;
}

// -------------------------------------------------------------------------------------------------

// TEMPLATE = app|lib|subdirs|aux|vcapp|vclib
SystemTemplateVariable = "TEMPLATE"
SystemTemplateVariableValue = "app" / "lib" / "subdirs" / "aux" / "vcapp" / "vclib"
TemplateAssignmentStatement = lvalue:SystemTemplateVariable AssignmentOperator rvalue:SystemTemplateVariableValue Whitespace* LineBreak* {
    if (!env.qmakeVars)
        env.qmakeVars = {};
    env.qmakeVars[lvalue] = rvalue;
    return {name:"TEMPLATE", op:"=", value:rvalue};
}

// -------------------------------------------------------------------------------------------------

// CONFIG = release|debug|debug_and_release|debug_and_release_target
SystemConfigVariable = "CONFIG"
SystemConfigVariableValue = "release" / "debug" / "debug_and_release" / "debug_and_release_target"

ConfigAssignmentStatement = lvalue:SystemConfigVariable AssignmentOperator rvalue:SystemConfigVariableValue? Whitespace* LineBreak* {
    if (!env.qmakeVars)
        env.qmakeVars = {};
    env.qmakeVars[lvalue] = [rvalue];
    return {name:"CONFIG", op:"=", value:rvalue};
 }

 ConfigAppendingAssignmentStatement = lvalue:SystemConfigVariable 
 AppendingAssignmentOperator rvalue:SystemConfigVariableValue Whitespace* LineBreak* {
    if (!env.qmakeVars)
        env.qmakeVars = {};
    if (!env.qmakeVars[lvalue])
        env.qmakeVars[lvalue] = [];
    env.qmakeVars[lvalue].push(rvalue);
    return {name:"CONFIG", op:"+=", value:rvalue};
}

// Assignment operators
AssignmentOperator = Whitespace* "=" Whitespace*
AppendingAssignmentOperator = Whitespace* "+=" Whitespace*

// Delimeters
LineBreak = [\r\n] {
    return "LB";
}

Whitespace = [ \t] {
    return "WS";
}

测试输入:

TEMPLATE = app
CONFIG += debug_and_release

测试 PEG.js 输出:

Line 2, column 16: Expected "CONFIG", "TEMPLATE", Comment string, [ \t], [\r\n], or end of input but "_" found.

最佳答案

PEG 从左到右评估 SystemConfigVariableValue,因此 debug_and_release 实际上将与 release 文字匹配(之后解析器会混淆) .

如果您先声明更具体的字面量,它会起作用:

SystemConfigVariableValue = "debug_and_release_target" / "debug_and_release" / "release" / "debug"

关于javascript - 使用 PEG.js 匹配包含 underscope 的字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44226562/

相关文章:

javascript - JQuery click 函数只工作一次,但需要多次工作

javascript - 如何让 @Model 和 @Emit 在 VueJs 中与 Typescript 一起工作?

c# - 字符串 "0.080"加倍使 80.00

c# - 如何使用 C# 验证 html 文件?

qt - 从子目录 pro 文件跨 .pro 文件持续存在的变量

javascript - JQuery html() 和模板

python - 在 Python3 中操作 JSON 配置文件内变量的最佳方法

c++ - qmake运行时如何将变量传递给qmake项目文件

c++ - 使用 qmake/Qt Creator 与调试/发布库链接

javascript - onClick 用新的 javascript 元素替换 javascript 元素