dtc: Clean up lexing of include files
Currently we scan the /include/ directive as two tokens, the "/include/" keyword itself, then the string giving the file name to include. We use a special scanner state to keep the two linked together, and use the scanner state stack to keep track of the original state while we're parsing the two /include/ tokens. This does mean that we need to enable the 'stack' option in flex, which results in a not-easily-suppressed warning from the flex boilerplate code. This is mildly irritating. However, this two-token scanning of the /include/ directive also has some extremely strange edge cases, because there are a variety of tokens recognized in all scanner states, including INCLUDE. For example the following strange dts file: /include/ /dts-v1/; / { /* ... */ }; Will be processed successfully with the /include/ being effectively ignored: the '/dts-v1/' and ';' are recognized even in INCLUDE state, then the ';' transitions us to PROPNODENAME state, throwing away INCLUDE, and the previous state is never popped off the stack. Or for another example this construct: foo /include/ = "somefile.dts" will be parsed as though it were: foo = /include/ "somefile.dts" Again, the '=' is scanned without leaving INCLUDE state, then the next string triggers the include logic. And finally, we use a different regexp for the string with the included filename than the normal string regexpt, which is also potentially weird. This patch, therefore, cleans up the lexical handling of the /include/ directive. Instead of the INCLUDE state, we instead scan the whole include directive, both keyword and filename as a single token. This does mean a bit more complexity in extracting the filename out of yytext, but I think it's worth it to avoid the strageness described above. It also means it's no longer possible to put a comment between the /include/ and the filename, but I'm really not very worried about breaking files using such a strange construct.main
parent
cdcb415851
commit
76e0622b68
|
@ -17,7 +17,7 @@
|
||||||
* USA
|
* USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
%option noyywrap nounput stack
|
%option noyywrap nounput
|
||||||
|
|
||||||
%x INCLUDE
|
%x INCLUDE
|
||||||
%x BYTESTRING
|
%x BYTESTRING
|
||||||
|
@ -26,6 +26,11 @@
|
||||||
PROPNODECHAR [a-zA-Z0-9,._+*#?@-]
|
PROPNODECHAR [a-zA-Z0-9,._+*#?@-]
|
||||||
PATHCHAR ({PROPNODECHAR}|[/])
|
PATHCHAR ({PROPNODECHAR}|[/])
|
||||||
LABEL [a-zA-Z_][a-zA-Z0-9_]*
|
LABEL [a-zA-Z_][a-zA-Z0-9_]*
|
||||||
|
STRING \"([^\\"]|\\.)*\"
|
||||||
|
WS [[:space:]]
|
||||||
|
COMMENT "/*"([^*]|\*+[^*/])*\*+"/"
|
||||||
|
LINECOMMENT "//".*\n
|
||||||
|
GAP ({WS}|{COMMENT}|{LINECOMMENT})*
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -91,16 +96,7 @@ const struct {
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%%
|
%%
|
||||||
<*>"/include/" {
|
<*>"/include/"{GAP}{STRING} ECHO;
|
||||||
ECHO;
|
|
||||||
yy_push_state(INCLUDE);
|
|
||||||
}
|
|
||||||
|
|
||||||
<INCLUDE>\"[^"\n]*\" {
|
|
||||||
ECHO;
|
|
||||||
yy_pop_state();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
<*>\"([^\\"]|\\.)*\" ECHO;
|
<*>\"([^\\"]|\\.)*\" ECHO;
|
||||||
|
|
||||||
|
@ -193,11 +189,7 @@ const struct {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
<*>[[:space:]]+ ECHO;
|
<*>{GAP} ECHO;
|
||||||
|
|
||||||
<*>"/*"([^*]|\*+[^*/])*\*+"/" ECHO;
|
|
||||||
|
|
||||||
<*>"//".*\n ECHO;
|
|
||||||
|
|
||||||
<*>- { /* Hack to convert old style memreserves */
|
<*>- { /* Hack to convert old style memreserves */
|
||||||
saw_hyphen = 1;
|
saw_hyphen = 1;
|
||||||
|
|
32
dtc-lexer.l
32
dtc-lexer.l
|
@ -18,7 +18,7 @@
|
||||||
* USA
|
* USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
%option noyywrap nounput yylineno stack
|
%option noyywrap nounput yylineno
|
||||||
|
|
||||||
%x INCLUDE
|
%x INCLUDE
|
||||||
%x BYTESTRING
|
%x BYTESTRING
|
||||||
|
@ -28,6 +28,10 @@
|
||||||
PROPNODECHAR [a-zA-Z0-9,._+*#?@-]
|
PROPNODECHAR [a-zA-Z0-9,._+*#?@-]
|
||||||
PATHCHAR ({PROPNODECHAR}|[/])
|
PATHCHAR ({PROPNODECHAR}|[/])
|
||||||
LABEL [a-zA-Z_][a-zA-Z0-9_]*
|
LABEL [a-zA-Z_][a-zA-Z0-9_]*
|
||||||
|
STRING \"([^\\"]|\\.)*\"
|
||||||
|
WS [[:space:]]
|
||||||
|
COMMENT "/*"([^*]|\*+[^*/])*\*+"/"
|
||||||
|
LINECOMMENT "//".*\n
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include "dtc.h"
|
#include "dtc.h"
|
||||||
|
@ -58,22 +62,19 @@ static int pop_input_file(void);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%%
|
%%
|
||||||
<*>"/include/" yy_push_state(INCLUDE);
|
<*>"/include/"{WS}*{STRING} {
|
||||||
|
char *name = strchr(yytext, '\"') + 1;
|
||||||
<INCLUDE>\"[^"\n]*\" {
|
yytext[yyleng-1] = '\0';
|
||||||
yytext[strlen(yytext) - 1] = 0;
|
push_input_file(name);
|
||||||
push_input_file(yytext + 1);
|
|
||||||
yy_pop_state();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
<*><<EOF>> {
|
<*><<EOF>> {
|
||||||
if (!pop_input_file()) {
|
if (!pop_input_file()) {
|
||||||
yyterminate();
|
yyterminate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<*>\"([^\\"]|\\.)*\" {
|
<*>{STRING} {
|
||||||
yylloc.file = srcpos_file;
|
yylloc.file = srcpos_file;
|
||||||
yylloc.first_line = yylineno;
|
yylloc.first_line = yylineno;
|
||||||
DPRINT("String: %s\n", yytext);
|
DPRINT("String: %s\n", yytext);
|
||||||
|
@ -197,16 +198,9 @@ static int pop_input_file(void);
|
||||||
return DT_INCBIN;
|
return DT_INCBIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
<*>[[:space:]]+ /* eat whitespace */
|
<*>{WS}+ /* eat whitespace */
|
||||||
|
<*>{COMMENT}+ /* eat C-style comments */
|
||||||
<*>"/*"([^*]|\*+[^*/])*\*+"/" {
|
<*>{LINECOMMENT}+ /* eat C++-style comments */
|
||||||
yylloc.file = srcpos_file;
|
|
||||||
yylloc.first_line = yylineno;
|
|
||||||
DPRINT("Comment: %s\n", yytext);
|
|
||||||
/* eat comments */
|
|
||||||
}
|
|
||||||
|
|
||||||
<*>"//".*\n /* eat line comments */
|
|
||||||
|
|
||||||
<*>. {
|
<*>. {
|
||||||
yylloc.file = srcpos_file;
|
yylloc.file = srcpos_file;
|
||||||
|
|
Loading…
Reference in New Issue