DevSpec: Grammar now parses params as key[=[val]]

* Updated docs to reflect this.
* This was important in allowing us to write the xcbXorg connection
 code.
This commit is contained in:
2025-01-14 14:09:35 -04:00
parent 4eb0ef75bc
commit aaae3dcbb2
4 changed files with 47 additions and 10 deletions
+5
View File
@@ -46,6 +46,11 @@ If there's more than one parameter item in a list of `api-params` or
+edev|audio-implexor|alsa(shmem|param2|param3)|alsa()|cardname +edev|audio-implexor|alsa(shmem|param2|param3)|alsa()|cardname
``` ```
Each parameter must be in one of these forms:
* key=value
* key=
* key
Some examples follow: Some examples follow:
### To attach a particular window from a window manager: ### To attach a particular window from a window manager:
+2 -1
View File
@@ -23,7 +23,8 @@
"|" { return PIPE; } "|" { return PIPE; }
"(" { return LPAREN; } "(" { return LPAREN; }
")" { return RPAREN; } ")" { return RPAREN; }
[^\|\(\) \t\r\n]+ { deviceSpecplval.str = strdup(yytext); return STRING; } [ \t]*"="[ \t]* { return EQUALS; } // Allow optional whitespace around equals
[^=\|\(\) \t\r\n]+ { deviceSpecplval.str = strdup(yytext); return STRING; } // Exclude = from STRING tokens
\r?\n { /* ignore newlines */ } \r?\n { /* ignore newlines */ }
[ \t]+ { /* ignore whitespace */ } [ \t]+ { /* ignore whitespace */ }
. { return yytext[0]; } . { return yytext[0]; }
+28 -5
View File
@@ -42,15 +42,18 @@ void yyerror(const char *message)
hk::device::SenseDeviceSpec* sensorSpec; hk::device::SenseDeviceSpec* sensorSpec;
hk::device::InteroceptorDeviceSpec* interoceptorSpec; hk::device::InteroceptorDeviceSpec* interoceptorSpec;
hk::device::ExtrospectorDeviceSpec* extrospectorSpec; hk::device::ExtrospectorDeviceSpec* extrospectorSpec;
std::vector<std::string>* stringVector; std::vector<std::pair<std::string,std::string>>* paramVector;
std::pair<std::string,std::string>* param;
} }
%token <str> STRING %token <str> STRING
%token PIPE DOUBLE_PIPE LPAREN RPAREN %token PIPE DOUBLE_PIPE LPAREN RPAREN
%token <chr> KEYWORD_SPECTYPE_ACTUATOR %token <chr> KEYWORD_SPECTYPE_ACTUATOR
%token <chr> KEYWORD_SPECTYPE_EXTROSPECTOR KEYWORD_SPECTYPE_INTEROSPECTOR %token <chr> KEYWORD_SPECTYPE_EXTROSPECTOR KEYWORD_SPECTYPE_INTEROSPECTOR
%token EQUALS // Add new token for '='
%type <stringVector> params opt_params %type <paramVector> params opt_params
%type <param> param
%type <sensorSpec> spec_body %type <sensorSpec> spec_body
%type <interoceptorSpec> interoceptor_spec %type <interoceptorSpec> interoceptor_spec
%type <extrospectorSpec> extrospector_spec %type <extrospectorSpec> extrospector_spec
@@ -114,12 +117,32 @@ spec_body:
opt_params: opt_params:
params params
| /* empty */ { $$ = new std::vector<std::string>(); } | /* empty */ { $$ = new std::vector<std::pair<std::string,std::string>>(); }
;
param:
STRING {
$$ = new std::pair<std::string,std::string>($1, "");
}
| STRING EQUALS {
$$ = new std::pair<std::string,std::string>($1, "");
}
| STRING EQUALS STRING {
$$ = new std::pair<std::string,std::string>($1, $3);
}
; ;
params: params:
STRING { $$ = new std::vector<std::string>{ $1 }; } param {
| params PIPE STRING { $$ = $1; $$->push_back($3); } $$ = new std::vector<std::pair<std::string,std::string>>();
$$->push_back(*$1);
delete $1;
}
| params PIPE param {
$$ = $1;
$$->push_back(*$3);
delete $3;
}
; ;
%% %%
+12 -4
View File
@@ -30,9 +30,9 @@ public:
char sensorType; char sensorType;
std::string implexor; std::string implexor;
std::string api; std::string api;
std::vector<std::string> apiParams; std::vector<std::pair<std::string,std::string>> apiParams;
std::string provider; std::string provider;
std::vector<std::string> providerParams; std::vector<std::pair<std::string,std::string>> providerParams;
std::string deviceSelector; std::string deviceSelector;
std::string stringify() const std::string stringify() const
@@ -42,12 +42,20 @@ public:
<< implexor << ", API: " << api << ", API Params: ("; << implexor << ", API: " << api << ", API Params: (";
for (const auto& param : apiParams) for (const auto& param : apiParams)
{ {
os << param << " "; os << param.first;
if (!param.second.empty()) {
os << "=" << param.second;
}
os << " ";
} }
os << "), Provider: " << provider << ", Provider Params: ("; os << "), Provider: " << provider << ", Provider Params: (";
for (const auto& param : providerParams) for (const auto& param : providerParams)
{ {
os << param << " "; os << param.first;
if (!param.second.empty()) {
os << "=" << param.second;
}
os << " ";
} }
os << "), Device Selector: " << deviceSelector << std::endl; os << "), Device Selector: " << deviceSelector << std::endl;