如何检测吉松的新线



我有一段Jison代码,看起来像这样:

%lex
%options flex
%{
if (!('regions' in yy)) {
yy.regions = [];
}
%}
text                [a-zA-Z][a-zA-Z0-9]*
%%
s+                 /* skip whitespace */
n+                 return 'NL';
","                 return ',';
"-"                 return '-';
"["                 return '[';
"]"                 return ']';
{text}              return 'TEXT';
<<EOF>>             return 'EOF';
/lex
%start expressions
%%
expressions
: content EOF
{
console.log(yy.regions);
return yy.regions; 
}
| EOF
{
console.log("empty file");
return yy.regions; 
}
;
content
: line NL content
{ console.log("NL"); }
| line content
{ console.log("no NL"); }
//| line NL
//    { console.log("parsing line with NL"); }
| line
{ console.log("parsing line"); }
;
line 
: '[' text ']'
{ yy.regions.push($2); $$ = $2; }
;
text
: TEXT
{ $$ = $1; }
;

这就是我目前的投入(我从我计划拥有的最基本的结构开始,我想从那里开始构建):

[sectionA]
[sectionB]
[sectionC]

我遇到的问题是没有检测到新线路。它总是进入line content,而从不进入line NL content。稍后,我想解析一些看起来更像这样的东西:

[sectionA]
something1, something2, something3
something4, something5, something6
[sectionB]
something4, something5, something6
[sectionC]
something4, something5, something6
something4, something5, something6
something4, something5, something6

在未来,这将变得更加复杂,但我最初的想法是将其分解为每行(在许多情况下,新行将用作分隔符)。我对这个东西完全陌生,所以我可能对如何解决这个问题有一个完全错误的想法。所以我的问题是如何检测新的线路?此外,如果我想做的事情有更好的方法,任何建议都是非常受欢迎的。谢谢

这两个规则都将匹配一个换行符:

s+                 /* skip whitespace */
n+                 return 'NL';

既然第一个是第一个,它就会赢。(Flex会警告你第二条规则没有使用,但我不相信jison会做那种分析。)

不过,更改规则的顺序并没有帮助,因为第一条规则将与SPACENL匹配,因此如果换行符前面有空格,则会将其吞下。您需要更改空白规则以仅匹配不是换行符的空白。

一种可能性是:

ns*     return 'NL';
[^Sn]+  /* ignore whitespace other than newlines */

第一个模式将匹配一个换行符,后面跟着任何空格序列,这意味着它将匹配多个换行符。这将避免在输入中有空行时返回多个NL令牌;除非空行很重要,否则这可能就是你想要的。

第二种模式避免匹配任何换行符,因此不会与第一种模式冲突。

有些人担心使用Windows行尾(rn),但由于Javascript的s包括r,所以这里没有真正的问题。第二条规则将忽略r,第一条规则将识别n。如果您认为有必要,可以将第一条规则更改为r?ns*以提高效率,但它可能不会更快。

@rici的回答很有帮助,让我走上了正轨。然而,[ t]+并没有做到我需要的。这是我最终使用的两条线路:

(r?n)+s*         return 'NEWLINE';
[^Srn]+          ; /* whitespace */

我在这里找到的。

编辑:@rici更新后的答案比这个答案更清楚,而且正是我需要的,所以我接受了

相关内容

  • 没有找到相关文章

最新更新