From 490fddb3f375aab801db7e679be98e37dbfac0ce Mon Sep 17 00:00:00 2001 From: ydah Date: Sat, 5 Sep 2026 00:55:27 +0900 Subject: [PATCH] Reject unknown percent directives with known prefixes --- lib/lrama/lexer.rb | 2 +- spec/lrama/lexer_spec.rb | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/lrama/lexer.rb b/lib/lrama/lexer.rb index d9b53810..9caac3db 100644 --- a/lib/lrama/lexer.rb +++ b/lib/lrama/lexer.rb @@ -121,7 +121,7 @@ def lex_token return when @scanner.scan(/#{SYMBOLS.join('|')}/) return [@scanner.matched, Lrama::Lexer::Token::Token.new(s_value: @scanner.matched, location: location)] - when @scanner.scan(/#{PERCENT_TOKENS.join('|')}/) + when @scanner.scan(/(?:#{PERCENT_TOKENS.join('|')})(?![-.\w])/) return [@scanner.matched, Lrama::Lexer::Token::Token.new(s_value: @scanner.matched, location: location)] when @scanner.scan(/[\?\+\*]/) return [@scanner.matched, Lrama::Lexer::Token::Token.new(s_value: @scanner.matched, location: location)] diff --git a/spec/lrama/lexer_spec.rb b/spec/lrama/lexer_spec.rb index 0aa8214a..a6376a53 100644 --- a/spec/lrama/lexer_spec.rb +++ b/spec/lrama/lexer_spec.rb @@ -407,6 +407,15 @@ end end + it 'does not match known percent directives as prefixes' do + ["%tokens FOO", "%typeof", "%expect-rr 2"].each do |text| + grammar_file = Lrama::Lexer::GrammarFile.new("directive.y", text) + lexer = Lrama::Lexer.new(grammar_file) + + expect { lexer.next_token }.to raise_error(ParseError, /Unexpected token/) + end + end + context 'unexpected_c_code.y' do it do grammar_file = Lrama::Lexer::GrammarFile.new("invalid.y", "@invalid")