- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个问题,我的规则无法减少。首先,我想编写一个 Yacc 规则来检测语句:
STUDENT_T* pSearch=pHead;
所以我写了如下规则:
struct_initialize: IDENTIFIER '*' IDENTIFIER '=' IDENTIFIER ';';
然后我将struct_initialize
放在规则上,如下所示:
struct_declaration
: struct_initialize
| specifier_qualifier_list ';' /* for anonymous struct/union */ {printf("29\n");}
| specifier_qualifier_list struct_declarator_list ';' {printf("30\n");}
| static_assert_declaration {printf("31\n");}
;
我的完整 Yacc 文件如下:
%token IDENTIFIER I_CONSTANT F_CONSTANT STRING_LITERAL FUNC_NAME SIZEOF
%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
%token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
%token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
%token XOR_ASSIGN OR_ASSIGN
%token TYPEDEF_NAME ENUMERATION_CONSTANT
%token TYPEDEF EXTERN STATIC AUTO REGISTER INLINE
%token CONST RESTRICT VOLATILE
%token BOOL CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE VOID
%token COMPLEX IMAGINARY
%token STRUCT UNION ENUM ELLIPSIS
%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
%token ALIGNAS ALIGNOF ATOMIC GENERIC NORETURN STATIC_ASSERT THREAD_LOCAL
%token INCLUDE
%start translation_unit
%{
#include<stdio.h>
#include<string.h>
extern FILE* yyin;
int yylex();
void yyerror(const char *s);
%}
%union{
char* a;
char* b;
}
/*%type <a>IDENTIFIER
*%type <a>SIGNED UNSIGNED
*%type <a>INT CHAR DOUBLE FLOAT LONG SHORT
*%type <b>EXTERN STATIC AUTO REGISTER*/
%%
include
: '#' INCLUDE '<' IDENTIFIER '.' IDENTIFIER '>'
| '#' INCLUDE STRING_LITERAL
;
struct_initialize
: IDENTIFIER '*' IDENTIFIER '=' IDENTIFIER ';'
;
primary_expression
: IDENTIFIER {printf("1\n");}
| constant
| string
| '(' expression ')'
| generic_selection
;
constant
: I_CONSTANT /* includes character_constant */ {printf("2\n");}
| F_CONSTANT
| ENUMERATION_CONSTANT /* after it has been defined as such */
;
enumeration_constant /* before it has been defined as such */
: IDENTIFIER {printf("3\n");}
;
string
: STRING_LITERAL
| FUNC_NAME
;
generic_selection
: GENERIC '(' assignment_expression ',' generic_assoc_list ')'
;
generic_assoc_list
: generic_association
| generic_assoc_list ',' generic_association
;
generic_association
: type_name ':' assignment_expression
| DEFAULT ':' assignment_expression
;
postfix_expression
: primary_expression {printf("59\n");}
| postfix_expression '[' expression ']' {printf("60\n");}
| postfix_expression '(' ')' {printf("61\n");}
| postfix_expression '(' argument_expression_list ')' {printf("62\n");}
| postfix_expression '.' IDENTIFIER {printf("63\n");}
| postfix_expression PTR_OP IDENTIFIER {printf("64\n");}
| postfix_expression INC_OP
| postfix_expression DEC_OP
| '(' type_name ')' '{' initializer_list '}' {printf("65\n");}
| '(' type_name ')' '{' initializer_list ',' '}' {printf("66\n");}
;
argument_expression_list
: assignment_expression
| argument_expression_list ',' assignment_expression
;
unary_expression
: postfix_expression {printf("67\n");}
| INC_OP unary_expression
| DEC_OP unary_expression
| unary_operator cast_expression {printf("71\n");}
| SIZEOF unary_expression
| SIZEOF '(' type_name ')'
| ALIGNOF '(' type_name ')'
;
unary_operator
: '&'
| '*'
| '+'
| '-'
| '~'
| '!'
;
cast_expression
: unary_expression {printf("68\n");}
| '(' type_name ')' cast_expression {printf("69\n");}
;
multiplicative_expression
: cast_expression {printf("70\n");}
| multiplicative_expression '*' cast_expression
| multiplicative_expression '/' cast_expression
| multiplicative_expression '%' cast_expression
;
additive_expression
: multiplicative_expression {printf("71\n");}
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
shift_expression
: additive_expression {printf("72\n");}
| shift_expression LEFT_OP additive_expression
| shift_expression RIGHT_OP additive_expression
;
relational_expression
: shift_expression {printf("73\n");}
| relational_expression '<' shift_expression
| relational_expression '>' shift_expression
| relational_expression LE_OP shift_expression
| relational_expression GE_OP shift_expression
;
equality_expression
: relational_expression {printf("74\n");}
| equality_expression EQ_OP relational_expression
| equality_expression NE_OP relational_expression
;
and_expression
: equality_expression {printf("75\n");}
| and_expression '&' equality_expression
;
exclusive_or_expression
: and_expression {printf("76\n");}
| exclusive_or_expression '^' and_expression
;
inclusive_or_expression
: exclusive_or_expression {printf("77\n");}
| inclusive_or_expression '|' exclusive_or_expression
;
logical_and_expression
: inclusive_or_expression {printf("78\n");}
| logical_and_expression AND_OP inclusive_or_expression
;
logical_or_expression
: logical_and_expression {printf("79\n");}
| logical_or_expression OR_OP logical_and_expression
;
conditional_expression
: logical_or_expression {printf("80\n");}
| logical_or_expression '?' expression ':' conditional_expression
;
assignment_expression
: conditional_expression {printf("81\n");}
| unary_expression assignment_operator assignment_expression {printf("69\n");}
;
assignment_operator
: '='
| MUL_ASSIGN
| DIV_ASSIGN
| MOD_ASSIGN
| ADD_ASSIGN
| SUB_ASSIGN
| LEFT_ASSIGN
| RIGHT_ASSIGN
| AND_ASSIGN
| XOR_ASSIGN
| OR_ASSIGN
;
expression
: assignment_expression {printf("82\n");}
| expression ',' assignment_expression
;
constant_expression
: conditional_expression /* with constraints */
;
declaration
: declaration_specifiers ';' /* no rule need*/ {printf("4\n");}
| declaration_specifiers init_declarator_list ';' /* int a;*/ {printf("5\n");}
| static_assert_declaration {printf("6\n");}
;
declaration_specifiers
: storage_class_specifier declaration {printf("7\n");}
| storage_class_specifier {printf("8\n");}
| type_specifier declaration_specifiers {printf("9\n");}
| type_specifier {printf("10\n");}
| type_qualifier declaration_specifiers{printf("11\n");}
| type_qualifier {printf("12\n");}
| function_specifier declaration_specifiers {printf("13\n");}
| function_specifier {printf("14\n");}
| alignment_specifier declaration_specifiers {printf("15\n");}
| alignment_specifier {printf("16\n");}
;
init_declarator_list
: init_declarator {printf("17\n");}
| init_declarator_list ',' init_declarator {printf("18\n");}
;
init_declarator
: declarator '=' initializer {printf("19\n");}
| declarator {printf("20\n");}
;
storage_class_specifier
: TYPEDEF /* identifiers must be flagged as TYPEDEF_NAME */ {printf("21\n");}
| EXTERN
| STATIC
| THREAD_LOCAL
| AUTO
| REGISTER
;
type_specifier
: VOID
| CHAR
| SHORT
| INT
| LONG
| FLOAT
| DOUBLE
| SIGNED
| UNSIGNED
| BOOL
| COMPLEX
| IMAGINARY /* non-mandated extension */
| atomic_type_specifier
| struct_or_union_specifier
| enum_specifier
| TYPEDEF_NAME /* after it has been defined as such */ {printf("22\n");}
;
struct_or_union_specifier
: struct_or_union '{' struct_declaration_list '}' {printf("23\n");}
| struct_or_union IDENTIFIER '{' struct_declaration_list '}' {printf("24\n");}
| struct_or_union IDENTIFIER {printf("25\n");}
;
struct_or_union
: STRUCT
| UNION
;
struct_declaration_list
: struct_declaration {printf("26\n");}
| struct_declaration_list struct_declaration {printf("27\n");}
;
struct_declaration
: struct_initialize
| specifier_qualifier_list ';' /* for anonymous struct/union */ {printf("29\n");}
| specifier_qualifier_list struct_declarator_list ';' {printf("30\n");}
| static_assert_declaration {printf("31\n");}
;
specifier_qualifier_list
: type_specifier specifier_qualifier_list {printf("32\n");}
| type_specifier {printf("33\n");}
| type_qualifier specifier_qualifier_list {printf("34\n");}
| type_qualifier {printf("35\n");}
;
struct_declarator_list
: struct_declarator {printf("36\n");}
| struct_declarator_list ',' struct_declarator {printf("37\n");}
;
struct_declarator
: ':' constant_expression {printf("38\n");}
| declarator ':' constant_expression {printf("39\n");}
| declarator {printf("40\n");}
;
enum_specifier
: ENUM '{' enumerator_list '}'
| ENUM '{' enumerator_list ',' '}'
| ENUM IDENTIFIER '{' enumerator_list '}'
| ENUM IDENTIFIER '{' enumerator_list ',' '}'
| ENUM IDENTIFIER
;
enumerator_list
: enumerator
| enumerator_list ',' enumerator
;
enumerator /* identifiers must be flagged as ENUMERATION_CONSTANT */
: enumeration_constant '=' constant_expression
| enumeration_constant
;
atomic_type_specifier
: ATOMIC '(' type_name ')'
;
type_qualifier
: CONST
| RESTRICT
| VOLATILE
| ATOMIC
;
function_specifier
: INLINE
| NORETURN
;
alignment_specifier
: ALIGNAS '(' type_name ')'
| ALIGNAS '(' constant_expression ')'
;
declarator
: pointer direct_declarator
| direct_declarator
;
direct_declarator
: IDENTIFIER {printf("41\n");}
| '(' declarator ')' {printf("42\n");}
| direct_declarator '[' ']' {printf("43\n");}
| direct_declarator '[' '*' ']' {printf("44\n");}
| direct_declarator '[' STATIC type_qualifier_list assignment_expression ']' {printf("45\n");}
| direct_declarator '[' STATIC assignment_expression ']' {printf("46\n");}
| direct_declarator '[' type_qualifier_list '*' ']'
| direct_declarator '[' type_qualifier_list STATIC assignment_expression ']'
| direct_declarator '[' type_qualifier_list assignment_expression ']'
| direct_declarator '[' type_qualifier_list ']' {printf("47\n");}
| direct_declarator '[' assignment_expression ']' {printf("48\n");}
| direct_declarator '(' parameter_type_list ')' {printf("49\n");}
| direct_declarator '(' ')' {printf("50\n");}
| direct_declarator '(' identifier_list ')' {printf("51\n");}
;
pointer
: '*' type_qualifier_list pointer
| '*' type_qualifier_list
| '*' pointer
| '*'
;
type_qualifier_list
: type_qualifier {printf("52\n");}
| type_qualifier_list type_qualifier {printf("53\n");}
;
parameter_type_list
: parameter_list ',' ELLIPSIS
| parameter_list
;
parameter_list
: parameter_declaration
| parameter_list ',' parameter_declaration
;
parameter_declaration
: declaration_specifiers declarator
| declaration_specifiers abstract_declarator
| declaration_specifiers
;
identifier_list
: IDENTIFIER
| identifier_list ',' IDENTIFIER
;
type_name
: specifier_qualifier_list abstract_declarator
| specifier_qualifier_list
;
abstract_declarator
: pointer direct_abstract_declarator
| pointer
| direct_abstract_declarator
;
direct_abstract_declarator
: '(' abstract_declarator ')'
| '[' ']'
| '[' '*' ']'
| '[' STATIC type_qualifier_list assignment_expression ']'
| '[' STATIC assignment_expression ']'
| '[' type_qualifier_list STATIC assignment_expression ']'
| '[' type_qualifier_list assignment_expression ']'
| '[' type_qualifier_list ']'
| '[' assignment_expression ']'
| direct_abstract_declarator '[' ']'
| direct_abstract_declarator '[' '*' ']'
| direct_abstract_declarator '[' STATIC type_qualifier_list assignment_expression ']'
| direct_abstract_declarator '[' STATIC assignment_expression ']'
| direct_abstract_declarator '[' type_qualifier_list assignment_expression ']'
| direct_abstract_declarator '[' type_qualifier_list STATIC assignment_expression ']'
| direct_abstract_declarator '[' type_qualifier_list ']'
| direct_abstract_declarator '[' assignment_expression ']'
| '(' ')'
| '(' parameter_type_list ')'
| direct_abstract_declarator '(' ')'
| direct_abstract_declarator '(' parameter_type_list ')'
;
initializer
: '{' initializer_list '}'
| '{' initializer_list ',' '}'
| assignment_expression {printf("83\n");}
;
initializer_list
: designation initializer
| initializer
| initializer_list ',' designation initializer
| initializer_list ',' initializer
;
designation
: designator_list '=' {printf("54\n");}
;
designator_list
: designator {printf("55\n");}
| designator_list designator {printf("56\n");}
;
designator
: '[' constant_expression ']'
| '.' IDENTIFIER
;
static_assert_declaration
: STATIC_ASSERT '(' constant_expression ',' STRING_LITERAL ')' ';'
;
statement
: labeled_statement
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
;
labeled_statement
: IDENTIFIER ':' statement
| CASE constant_expression ':' statement
| DEFAULT ':' statement
;
compound_statement
: '{' '}'
| '{' block_item_list '}'
;
block_item_list
: block_item
| block_item_list block_item
;
block_item
: declaration
| statement
;
expression_statement
: ';'
| expression ';'
;
selection_statement
: IF '(' expression ')' statement ELSE statement
| IF '(' expression ')' statement
| SWITCH '(' expression ')' statement
;
iteration_statement
: WHILE '(' expression ')' statement
| DO statement WHILE '(' expression ')' ';'
| FOR '(' expression_statement expression_statement ')' statement
| FOR '(' expression_statement expression_statement expression ')' statement
| FOR '(' declaration expression_statement ')' statement
| FOR '(' declaration expression_statement expression ')' statement
;
jump_statement
: GOTO IDENTIFIER ';'
| CONTINUE ';'
| BREAK ';'
| RETURN ';'
| RETURN expression ';'
;
translation_unit
: external_declaration
| translation_unit external_declaration
;
external_declaration
: function_definition
| declaration
| include /********/
;
function_definition
: declaration_specifiers declarator declaration_list compound_statement
| declaration_specifiers declarator compound_statement
;
declaration_list
: declaration {printf("57\n");}
| declaration_list declaration {printf("58\n");}
;
%%
#include <stdio.h>
void yyerror(const char *s)
{
fflush(stdout);
fprintf(stderr, "*** %s\n", s);
}
void parse(FILE* fileInput)
{
yyin= fileInput;
while(feof(yyin)==0)
{
yyparse();// To read file, while() and yyparse() is necessary because we need to read until the content is run out
}
}
这是相应的 Lex 代码:
%e 1019
%p 2807
%n 371
%k 284
%a 1213
%o 1117
Q \"
O [0-7]
D [0-9]
NZ [1-9]
L [a-zA-Z_]
A [a-zA-Z_0-9]
H [a-fA-F0-9]
HP (0[xX])
E ([Ee][+-]?{D}+)
P ([Pp][+-]?{D}+)
FS (f|F|l|L)
IS (((u|U)(l|L|ll|LL)?)|((l|L|ll|LL)(u|U)?))
CP (u|U|L)
SP (u8|u|U|L)
ES (\\(['"\?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F0-9]+))
WS [ \t\v\n\f]
%{
#include <stdio.h>
#include "y.tab.h"
extern void yyerror(const char *); /* prints grammar violation message */
extern int sym_type(const char *); /* returns type from symbol table */
#define sym_type(identifier) IDENTIFIER /* with no symbol table, fake it */
static void comment(void);
static int check_type(void);
%}
%%
"/*" { comment(); }
"//".* { /* consume //-comment */ }
"include" { yylval.a=strdup(yytext); return(INCLUDE); }
"void" { yylval.a=strdup(yytext); return(VOID); }
"int" { yylval.a=strdup(yytext); return(INT); } /* Data Type*/
"long" { yylval.a=strdup(yytext); return(LONG); }
"char" { yylval.a=strdup(yytext); return(CHAR); }
"short" { yylval.a=strdup(yytext); return(SHORT); }
"signed" { yylval.a=strdup(yytext); return(SIGNED); }
"double" { yylval.a=strdup(yytext); return(DOUBLE); }
"unsigned" { yylval.a=strdup(yytext); return(UNSIGNED); }
"float" { yylval.a=strdup(yytext); return(FLOAT); }
"auto" { yylval.a=strdup(yytext); return(AUTO); } /*Storage Class*/
"extern" { yylval.a=strdup(yytext); return(EXTERN); }
"register" { yylval.a=strdup(yytext); return(REGISTER); }
"static" { yylval.a=strdup(yytext); return(STATIC); }
"const" { yylval.a=strdup(yytext); return(CONST); } /*Type Qualifier*/
"restrict" { yylval.a=strdup(yytext); return(RESTRICT); }
"volatile" { yylval.a=strdup(yytext); return(VOLATILE); }
"_Atomic" { yylval.a=strdup(yytext); return ATOMIC; }
"break" { yylval.a=strdup(yytext); return(BREAK); }
"case" { yylval.a=strdup(yytext); return(CASE); }
"continue" { yylval.a=strdup(yytext); return(CONTINUE); }
"default" { yylval.a=strdup(yytext); return(DEFAULT); }
"do" { yylval.a=strdup(yytext); return(DO); }
"else" { yylval.a=strdup(yytext); return(ELSE); }
"enum" { yylval.a=strdup(yytext); return(ENUM); }
"for" { yylval.a=strdup(yytext); return(FOR); }
"goto" { yylval.a=strdup(yytext); return(GOTO); }
"if" { yylval.a=strdup(yytext); return(IF); }
"inline" { yylval.a=strdup(yytext); return(INLINE); }
"return" { yylval.a=strdup(yytext); return(RETURN); }
"sizeof" { yylval.a=strdup(yytext); return(SIZEOF); }
"struct" { yylval.a=strdup(yytext); return(STRUCT); }
"switch" { yylval.a=strdup(yytext); return(SWITCH); }
"typedef" { yylval.a=strdup(yytext); return(TYPEDEF); }
"union" { yylval.a=strdup(yytext); return(UNION); }
"while" { yylval.a=strdup(yytext); return(WHILE); }
"_Alignas" { yylval.a=strdup(yytext); return ALIGNAS; }
"_Alignof" { yylval.a=strdup(yytext); return ALIGNOF; }
"_Bool" { yylval.a=strdup(yytext); return BOOL; }
"_Complex" { yylval.a=strdup(yytext); return COMPLEX; }
"_Generic" { yylval.a=strdup(yytext); return GENERIC; }
"_Imaginary" { yylval.a=strdup(yytext); return IMAGINARY; }
"_Noreturn" { yylval.a=strdup(yytext); return NORETURN; }
"_Static_assert" { yylval.a=strdup(yytext); return STATIC_ASSERT; }
"_Thread_local" { yylval.a=strdup(yytext); return THREAD_LOCAL; }
"__func__" { yylval.a=strdup(yytext); return FUNC_NAME; }
{Q} { yylval.a=strdup(yytext); return'"'; }
"..." { yylval.a=strdup(yytext); return ELLIPSIS; }
">>=" { yylval.a=strdup(yytext); return RIGHT_ASSIGN; }
"<<=" { yylval.a=strdup(yytext); return LEFT_ASSIGN; }
"+=" { yylval.a=strdup(yytext); return ADD_ASSIGN; }
"-=" { yylval.a=strdup(yytext); return SUB_ASSIGN; }
"*=" { yylval.a=strdup(yytext); return MUL_ASSIGN; }
"/=" { yylval.a=strdup(yytext); return DIV_ASSIGN; }
"%=" { yylval.a=strdup(yytext); return MOD_ASSIGN; }
"&=" { yylval.a=strdup(yytext); return AND_ASSIGN; }
"^=" { yylval.a=strdup(yytext); return XOR_ASSIGN; }
"|=" { yylval.a=strdup(yytext); return OR_ASSIGN; }
">>" { yylval.a=strdup(yytext); return RIGHT_OP; }
"<<" { yylval.a=strdup(yytext); return LEFT_OP; }
"++" { yylval.a=strdup(yytext); return INC_OP; }
"--" { yylval.a=strdup(yytext); return DEC_OP; }
"->" { yylval.a=strdup(yytext); return PTR_OP; }
"&&" { yylval.a=strdup(yytext); return AND_OP; }
"||" { yylval.a=strdup(yytext); return OR_OP; }
"<=" { yylval.a=strdup(yytext); return LE_OP; }
">=" { yylval.a=strdup(yytext); return GE_OP; }
"==" { yylval.a=strdup(yytext); return EQ_OP; }
"!=" { yylval.a=strdup(yytext); return NE_OP; }
";" { yylval.a=strdup(yytext); return ';'; }
("{"|"<%") { yylval.a=strdup(yytext); return '{'; }
("}"|"%>") { yylval.a=strdup(yytext); return '}'; }
"," { yylval.a=strdup(yytext); return ','; }
":" { yylval.a=strdup(yytext); return ':'; }
"=" { yylval.a=strdup(yytext); return '='; }
"(" { yylval.a=strdup(yytext); return '('; }
")" { yylval.a=strdup(yytext); return ')'; }
("["|"<:") { yylval.a=strdup(yytext); return '['; }
("]"|":>") { yylval.a=strdup(yytext); return ']'; }
"." { yylval.a=strdup(yytext); return '.'; }
"&" { yylval.a=strdup(yytext); return '&'; }
"!" { yylval.a=strdup(yytext); return '!'; }
"~" { yylval.a=strdup(yytext); return '~'; }
"-" { yylval.a=strdup(yytext); return '-'; }
"+" { yylval.a=strdup(yytext); return '+'; }
"*" { yylval.a=strdup(yytext); return '*'; }
"/" { yylval.a=strdup(yytext); return '/'; }
"%" { yylval.a=strdup(yytext); return '%'; }
"<" { yylval.a=strdup(yytext); return '<'; }
">" { yylval.a=strdup(yytext); return '>'; }
"^" { yylval.a=strdup(yytext); return '^'; }
"|" { yylval.a=strdup(yytext); return '|'; }
"?" { yylval.a=strdup(yytext); return '?'; }
"#" { yylval.a=strdup(yytext); return '#'; }
{L}{A}* { return check_type(); }
{HP}{H}+{IS}? { yylval.a=strdup(yytext); return I_CONSTANT; }
{NZ}{D}*{IS}? { yylval.a=strdup(yytext); return I_CONSTANT; }
"0"{O}*{IS}? { yylval.a=strdup(yytext); return I_CONSTANT; }
{CP}?"'"([^'\\\n]|{ES})+"'" { return I_CONSTANT; } /**/
{D}+{E}{FS}? { yylval.a=strdup(yytext); return F_CONSTANT; }
{D}*"."{D}+{E}?{FS}? { yylval.a=strdup(yytext); return F_CONSTANT; }
{D}+"."{E}?{FS}? { yylval.a=strdup(yytext); return F_CONSTANT; }
{HP}{H}+{P}{FS}? { yylval.a=strdup(yytext);return F_CONSTANT; }
{HP}{H}*"."{H}+{P}{FS}? { yylval.a=strdup(yytext); return F_CONSTANT; }
{HP}{H}+"."{P}{FS}? { yylval.a=strdup(yytext); return F_CONSTANT; }
({SP}?\"([^"\\\n]|{ES})*\"{WS}*)+ { return STRING_LITERAL; }
{WS}+ { /* whitespace separates tokens */ }
. { /* discard bad characters */ }
%%
int yywrap(void) /* called at end of input */
{
return 1; /* terminate now */
}
static void comment(void)
{
int c;
while ((c = input()) != 0)
if (c == '*')
{
printf("1: %d\n",c);
while ((c = input()) == '*')
;
printf("2: %d\n",c);
if (c == '/')
return;
if (c == 0)
printf("3: %d\n",c);
break;
}
yyerror("unterminated comment");
}
static int check_type(void)
{
switch (sym_type(yytext))
{
case TYPEDEF_NAME: /* previously defined */
{
printf("TYPEDEF_NAME\n");
return TYPEDEF_NAME;
}
case ENUMERATION_CONSTANT: /* previously defined */
{
printf("ENUMERATION\n");
return ENUMERATION_CONSTANT;
}
default: /* includes undefined */ /*This is when do normal declaration such as int a=3; in this case it return a*/
{
printf("IDENTIFIER\n");
yylval.a=strdup(yytext);
return IDENTIFIER;
}
}
}
当它读取到语句:STUDENT_T* pSearch=pHead;
输出是:
--accepting rule at line 156 ("STUDENT_T")
IDENTIFIER
--accepting rule at line 146 ("*")
1
59
67
68
70
--accepting rule at line 173 (" ")
--accepting rule at line 156 ("pSearch")
IDENTIFIER
1
59
--accepting rule at line 135 ("=")
67
68
71
72
73
74
75
76
77
78
79
80
81
82
*** syntax error
请注意,我在 Yacc 文件中使用了 printf
以及字符串文字作为数字 1-80 进行调试。您能告诉我哪里出了问题以及如何解决吗?
最佳答案
仅由以下内容组成的文本
STUDENT_T* pSearch=pHead;
在您提供的语法中无效,因为它正在被标记化。
您的词法分析器将 STUDENT_T
匹配为第一个标记,这很好。它将其分类为IDENTIFIER
,这在上下文中似乎是合理的。但到那时你就死了:没有符合你的语法且以 IDENTIFIER
开头的文本。事实上,您的 struct_initialize 生成可以匹配您的标记序列并没有帮助,因为即使解析器减少了该符号的整个输入,也无法将其其余部分减少到 translation_unit
起始符号。
就其值(value)而言,my yacc
(byacc 1.9) 会发出一个解析器,一旦它看到 IDENTIFIER
作为第一个 token ,我的 bison
(v2.7) 也是如此。我觉得有点令人惊讶的是,您的 yacc 为您提供了一个解析器,它在认识到没有希望之前做了更多工作,如果它确实在您指定的输入上进行操作的话。但无论如何,我认为没有理由认为解析器会产生错误的结果。
更深入地研究语法,struct_initialize
唯一可以出现的地方就是它可以充当 struct_declaration
的地方。它仅用作 struct_declaration_list 的一部分或全部,它是结构或 union 声明的内容。事实上,该文本被根据您的语法构建的解析器接受:
struct { STUDENT_T* pSearch=pHead; };
并且一些额外的检测表明解析器在执行此操作时使用了您的产生式。
关于c - 我想要的Yacc规则并没有减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42281747/
我需要在 nginx-ingress 版本上允许来自多个来源的请求:http://localhost:4200、http://localhost:4242 等1.7.1.但我无法对多个来源执行此操作,
我正在部署我使用 APIGILITY 开发的 API到 IIS。由于 IIS 不支持 .htaccess,我试图从 .htaccess 文件的内容创建 web.config 文件。我使用 IISv7.
我正在尝试更改上面 css 样式中的“宽度”规则。在“inspect element”中你可以看到宽度是1008px。我不希望它是 1008px 但它不会让我在 css 样式中更改它你可以看到它被“删
外部css赋值有2种方法,我用的是第一种;大多数网站使用第二种方法。我想知道我是否做错了! 第一种方法: 为几乎每个 css 规则创建一个类并在任何地方使用它们。 blah blah .f_
RDF使用 WEB 标识符 (URIs) 来标识资源,使用属性和属性值来描述资源 RDF 资源、属性和属性值 RDF使用 WEB 标识符来标识事物,并通过属性和属性值来描述资源。 关于资源、属性
我想挖掘特定的 rhs 规则。文档中有一个示例证明这是可能的,但仅适用于特定情况(如下所示)。先来一个数据集来说明我的问题: input {b=100002} 0.2500000 0.250000
我想让 nginx 从网站根目录(:http://localhost:8080/)提供一个静态文件,但它为我的代理通行证提供服务;它提供“/”规则而不是“=/”。 这是我的 nginx 配置的样子:
根据gnu make documentation , 如果一个规则通过一次调用生成多个目标(例如,一个配方执行一个带有多个输出文件的工具),你可以使用 '&:' 规则语法来告诉 make。但是,当在多
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我正在尝试做一些多态性练习,但我无法弄清楚这种多态性是如何工作的。我没有找到任何关于这种练习的深入信息。希望大家能给我一些解释。 练习1: class Top { public void m(
为了调试复杂的 XSLT 转换,我将其分为几个部分:首先构建 %.1.xml,然后使用它构建 %.2.xml ,最后构建 %.3.xml。一切正常,但如果我要求 Make 构建最后一个,Make 总是
我尝试了 hacerrank 的 slove 练习 Click我不知道如何添加这些规则: ► 它可以包含 4 个一组的数字,并用一个连字符“-”分隔。 ► 不得有 4 个或更多连续重复数字。 这是我的
我正在尝试编写一个小测验,我希望“再试一次”按钮遵循与“else”之前的“if”语句相同的规则 using System; public class Program { public stat
在我的 Spring/Boot Java 项目中,我有一组服务方法,例如以下一个: @Override public Decision create(String name, String descr
我正在阅读 Covariant virtual function .上面写着 假设 B::f 覆盖了虚函数 A::f。如果满足以下所有条件,A::f 和 B::f 的返回类型可能不同: 1) The
我工作的公司想要分发(在公共(public)链接中)具有内部签名的应用程序。我很确定 Apple 否认这种事情,但我在官方文档/契约(Contract)中没有找到任何相关信息。 有谁知道它到底是如何工
我是 CSS 新手。我观察到一个奇怪的 CSS 行为,其中一个元素具有以下 CSS 属性 .container .header{ color: #FFFFFF; font-size: 2em;
这个问题在这里已经有了答案: Is there a CSS selector for elements containing certain text? (21 个答案) 关闭 7 年前。
我有以下 CSS: workoutcal.css: .errorlist{ color:red; } 以下基本模板: base.html: {% load static %} {
我是一名优秀的程序员,十分优秀!