带有字符串文字的 ANTLR 解析器规则

发布于 2024-12-05 16:20:43 字数 286 浏览 0 评论 0原文

假设我的解析器规则如下所示:

rule1 : 'functionA' '(' expression-inside-parenthesis ')'; 
expression-inside-parenthesis: ....;

但我从未为“functionA”、“(”和“)”定义任何词法分析器规则。这些会被解析器视为标记吗?对于“(”和“)”,无论如何都只有 1 个字符,我认为没有区别。但是对于“functionA”,如果我从未在词法分析器规则中将其定义为标记,那么解析器如何将其视为标记?

Say if my parser rules look like this:

rule1 : 'functionA' '(' expression-inside-parenthesis ')'; 
expression-inside-parenthesis: ....;

But I never defined any lexer rule for 'functionA', '(' and ')'. Would these be considered tokens by the parser? For '(' and ')', there is only 1 character anyway and I suppose there would be no difference. But for 'functionA', if I never defined it as a token in my lexer rules, how could the parser see it as a token?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暮年慕年 2024-12-12 16:20:43

JavaMan 写道:

解析器如何将其视为令牌?

ANTLR 在幕后为您创建一个代币。

规则:

rule1 : 'functionA' '(' expression-inside-parenthesis ')';
// parser rules ...
// lexer rules  ...

等效于:

rule1 : FA '(' expression-inside-parenthesis ')';
// parser rules ...
FA : 'functionA';
// lexer rules  ...

如果标记仅包含 1 个字符并且不出现在其他标记中,例如 '('')',则为可以在解析器规则中“动态”定义它们,只要您的词法分析器语法也包含类似标识符的标记,最好自己在词法分析器内显式定义像 'functionA' 这样的标记语法。通过自己显式定义它们,词法分析器尝试对您的输入进行标记的顺序会更清楚。

编辑

如果您使用了文字标记并定义了匹配相同的词法分析器规则,如下所示:

parse : 'functionA' ID;
FA    : 'functionA';
ID    : 'a'..'z'+;

然后 ANTLR 将 parse 规则解释为:

parse : FA ID;

JavaMan wrote:

how could the parser see it as a token?

ANTLR creates a token for you behind the scenes.

The rule:

rule1 : 'functionA' '(' expression-inside-parenthesis ')';
// parser rules ...
// lexer rules  ...

is equivalent to:

rule1 : FA '(' expression-inside-parenthesis ')';
// parser rules ...
FA : 'functionA';
// lexer rules  ...

In case of tokens that only consist of 1 character and do not occur within other tokens, like '(' and ')', it is okay to define them "on the fly" inside your parser rule, put as soon as your lexer grammar also contains identifier-like tokens, it's best to explicitly define a token like 'functionA' yourself inside the lexer grammar. By defining them yourself explicitly, it is clearer in what order the lexer tries to tokenize your input.

EDIT

And in case you've used a literal-token and defined a lexer rule that matches the same, like this:

parse : 'functionA' ID;
FA    : 'functionA';
ID    : 'a'..'z'+;

then ANTLR interprets the parse rule as this:

parse : FA ID;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文