Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison 使解析器忽略行注释(尾随注释除外)_Bison_Jison - Fatal编程技术网

Bison 使解析器忽略行注释(尾随注释除外)

Bison 使解析器忽略行注释(尾随注释除外),bison,jison,Bison,Jison,我正在使用(Bison的Javascript版本,非常类似) 客观的 我想解析输入并获取有效的标记(标识符和尾随注释) 我的定义 标识符 一个单词包含字母表 一条行注释 以--和零个或多个字母开头的一整行;或 一整行,以一个或多个空格(空格、制表符)开头,后跟--和零个或多个字母 一条尾随注释 以--开头但在标识符之后的字符串 为简单起见,假设我有一个要解析的输入文件: 输入 为了解析上述内容,我编写了Jison/Bison文件(见下文),但它不完整,只解析非注释内容,即: 输出(

我正在使用(Bison的Javascript版本,非常类似)

客观的 我想解析输入并获取有效的标记(
标识符
尾随注释

我的定义
  • 标识符
    • 一个单词包含字母表
  • 一条
    行注释
  • --
    和零个或多个字母开头的一整行;或
  • 一整行,以一个或多个空格(空格、制表符)开头,后跟
    --
    和零个或多个字母
  • 一条
    尾随注释
    • --
      开头但在
      标识符之后的字符串
      为简单起见,假设我有一个要解析的输入文件:
输入 为了解析上述内容,我编写了Jison/Bison文件(见下文),但它不完整,只解析非注释内容,即:

输出(电流,错误) 但是,我希望解析器将尾随注释作为单个有效字符串,即:

产出(预期) 鉴于Jison/Bisnon文件如下所示,我如何按预期修改它

吉森/野牛
%lex
%%
\s+/*跳过空格*/
'--'./*跳过注释*/
[a-zA-Z]+返回“标识符”
返回“EOF”
.           /* 跳过其他的*/
/莱克斯
%起始表达式
%%
表达
:表达式EOF
|表达
|表情
{;}
;
表达
:“标识符”
{console.log($1);$$=$1;}
;
在(f)lex中,我会使用以
^
开头的规则强制它只在行首匹配,但jison不会这样解释插入符号,而且在任何情况下,您都不想将初始注释限制在行首,而是限制在行上的第一个非空白标记。(我不清楚您希望如何处理标识符以外的令牌。我忽略了这个问题。请参阅以三个问号开头的注释。)

一种简单的方法是使用“启动条件”(参见Jison’s中的示例),如下所示:(但请参见下面的注释以获得更好的解决方案):


向lexer对象添加自定义字段时必须小心;没有文档定义保留哪些名称(或可以使用哪些名称前缀)。

您想如何处理缩进了
--
的行?@rici抱歉,我已经更新了这个问题。我想要一个解析器将尾随的coment作为单个字符串。@jeon:这很酷,但它不能回答我的问题。如果在“--这必须被忽略”之前有空格,它仍然是行注释还是成为尾随注释?@rici我想把一行以
--
开头,一行以一个或多个空格开头,后跟
--
作为行注释。谢谢,我会研究并尝试它。谢谢,它成功了。事实上,事情有点复杂(例如,大括号末尾的尾随注释中有多行)。所以我不能使用第二个选项。所以我选择使用第一个选项。
I want -- not to ignore this
-- This must be ignored
I
want
I
want
-- not to ignore this
%lex
%%

\s+         /* skip whitespace */
'--'.*      /* skip comment */
[a-zA-Z]+   return 'IDENTIFIER'
<<EOF>>     return 'EOF'
.           /* skip the others */

/lex

%start expressions
%%

expressions
    : expressions EOF
    | expressions expression
    | expression
        {;}
    ;

expression
    : 'IDENTIFIER'
        {console.log($1); $$ = $1;}
    ;
%lex
%s TRAILING
%%

\n                  this.begin('INITIAL')
\s                  /* skip whitespace */
<TRAILING>'--'.*    return 'IDENTIFIER'; /* or whatever */
<INITIAL>'--'.*     /* skip initial comments */
[a-zA-Z]+           this.begin('TRAILING'); return 'IDENTIFIER'
.                   /* ??? this.begin('TRAILING'); */ /* skip the others */
<<EOF>>             return 'EOF'
%lex
%%

\s+             /* skip whitespace */
'--'.*          if (yylloc.first_line == this.last_id_line) return 'IDENTIFIER';
[a-zA-Z]+       this.last_id_line = yylloc.first_line; return 'IDENTIFIER'
.               /* skip the others */
<<EOF>>         return 'EOF'