【发布时间】:2014-01-16 22:08:06
【问题描述】:
tl;dr:如何在不执行预处理步骤的情况下使用 jison 模拟 C 的 #define 等效项?
我正在研究一种相对简单的语法,该语法具有为代码块分配标识符的功能,为了简洁起见,以后可以重复使用该标识符。示例:
# Valid grammar with various elements of different types
foo x.3 y.4 z.5
# Assign an id to a chunk of code. Everything after -> is assigned to id
fill_1-> bar a.1 b.2 c.3
# Use chunk of code later
# Should be equivalent to parsing: "baz d.4 bar a.1 b.2 c.3 e.5"
baz d.4 ["fill_1"] e.5
到目前为止,我的解析器设置已正确识别代码的分配行并将“->”右侧的部分存储在可用于其他解析器操作的字典中。与下面提供的定义操作相关的代码:
// Lexer
HSPC [ \t]
ID [a-zA-Z_][a-zA-Z0-9_]*
%%
{ID}{HSPC}*"->" {
this.begin("FINISHLINE");
yytext = yytext.replace("->", "").trim();
return "DEFINE";
}
('"'{ID}'"') {
yytext = yytext.slice(1,-1);
return "QUOTED_ID";
}
<FINISHLINE>.* {
this.begin("INITIAL");
yytext = yytext.trim();
return "REST_OF_LINE";
}
%%
// Parser
statement
: "[" QUOTED_ID "]"
{ $$ = (defines[$2] ? defines[$2] : ""); }
| DEFINE REST_OF_LINE
{
defines[$1] = $2;
}
;
%%
var defines = {};
如何让 jison 真正标记和解析保存的 sn-p 代码?我需要采用 AST 方法吗?有没有办法将代码注入解析器?这应该发生在词法分析阶段还是解析阶段?希望听到可以通过简短示例 sn-ps 采取的多种策略。
谢谢!
【问题讨论】:
-
顺便说一句:您在宏调用中使用双引号的语法令人困惑。特别是,它看起来很像普通人按照惯例认为的文本字符串,他们会误认为它是这样的。鼓励这种错误毫无意义。我会选择不同的语法。在设计供他人使用的东西时,您希望使用最少意外原则。
-
@IraBaxter 我认为你的观点很好,我会考虑更新该语法。
标签: parsing bison lex flex-lexer jison