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")