JISON递归读取令牌后的整个输入文本



我对parser/cfg或jison非常陌生。我想让我的语法做的是:

  1. 读取令牌地址到EOF 之后的所有内容

  2. 在"ADDRESS TO EOF"(来自步骤1)之间可以有多个ADDRESS令牌

我的样本输入看起来像:

...abc xyz address 101 My Street, Austin, CO 12345 is abc xyz my name is govind my address is 102 My Street,Austin, CO 12345 and here it is end of file.

我期望的输出是

address 101 My Street, Austin, CO 12345 is abc xyz my name is govind my address is 102 My Street,Austin, CO 12345 and here it is end of file.`

我正在尝试的代码是

/* lexical grammar */
%lex
%options flex
%{
if (!('chars' in yy)) {
   yy.temp = 0;
}

%}
%%
s+                   /* skip whitespace */ 
(address|Address)      return 'ADDRESS'
<<EOF>>                return 'EOF'
[A-Za-z0-9]+           return 'VARIABLE'
.                     /*skip */
/lex
%start expressions
%% /* language grammar */
expressions
   : other EOF
    {return $1;}
   ;
other
  :VARIABLE{$$=$1;}  
  |other ADDRESS other {$$=$1+"-"+$2+"-"+$3;} 
  ;

我认为应该有更多的表达式来实现输出,因为other ADDRESS other正在引发S/R冲突。有人能建议我如何在第一个ADDRESS令牌出现之前跳过所有输入,而不是将所有其他输入放在$$中吗。谢谢

一般来说,当你只想识别XY列表中的第一个X时,你需要这样的东西:

list: head X tail;
tail: | tail X | tail Y;
head: | head Y;

这里head匹配Y的任何数字(包括0),并且tail匹配XY/em>的任意数字(包括零)。因此,list匹配的X必须是输入中的第一个X,并且不存在歧义。

在这种情况下,这里的tail非终端是不必要的,但生成正确的解析树通常是有用的。你可以写上面的语法:

list: head X | list X | list Y;
head: | head Y;

如果您还想匹配没有任何X的列表,您可以添加生产list: head:

list: head | head X tail;
tail: | tail X | tail Y;
head: | head Y;

相关内容

  • 没有找到相关文章

最新更新