我对parser/cfg或jison非常陌生。我想让我的语法做的是:
-
读取令牌地址到EOF 之后的所有内容
-
在"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
令牌出现之前跳过所有输入,而不是将所有其他输入放在$$
中吗。谢谢
一般来说,当你只想识别X或Y列表中的第一个X时,你需要这样的东西:
list: head X tail;
tail: | tail X | tail Y;
head: | head Y;
这里head
匹配Y的任何数字(包括0),并且tail
匹配X或Y/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;