Give a better error message when a referenced ptype has not been declared
This commit is contained in:
parent
985b180f62
commit
0d1ee74ca6
@ -51,6 +51,7 @@ class Propane
|
||||
unless found_default
|
||||
raise Error.new("No patterns found for default mode")
|
||||
end
|
||||
check_ptypes!
|
||||
# Add EOF token.
|
||||
@grammar.tokens << Token.new("$EOF", nil, nil)
|
||||
tokens_by_name = {}
|
||||
@ -131,6 +132,17 @@ class Propane
|
||||
@parser = Parser.new(@grammar, rule_sets, @log)
|
||||
end
|
||||
|
||||
# Check that any referenced ptypes have been defined.
|
||||
def check_ptypes!
|
||||
(@grammar.patterns + @grammar.tokens + @grammar.rules).each do |potor|
|
||||
if potor.ptypename
|
||||
unless @grammar.ptypes.include?(potor.ptypename)
|
||||
raise Error.new("Error: Line #{potor.line_number}: ptype #{potor.ptypename} not declared. Declare with `ptype` statement.")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Generate and add rules for any optional components.
|
||||
def generate_optional_component_rules!(tokens_by_name)
|
||||
optional_rules_added = Set.new
|
||||
|
@ -148,6 +148,42 @@ EOF
|
||||
expect(results.status).to_not eq 0
|
||||
end
|
||||
|
||||
it "raises an error when a pattern referenced ptype has not been defined" do
|
||||
write_grammar <<EOF
|
||||
ptype yes = int;
|
||||
/foo/ (yes) <<
|
||||
>>
|
||||
/bar/ (no) <<
|
||||
>>
|
||||
EOF
|
||||
results = run_propane(capture: true)
|
||||
expect(results.stderr).to match /Error: Line 4: ptype no not declared\. Declare with `ptype` statement\./
|
||||
expect(results.status).to_not eq 0
|
||||
end
|
||||
|
||||
it "raises an error when a token referenced ptype has not been defined" do
|
||||
write_grammar <<EOF
|
||||
ptype yes = int;
|
||||
token foo (yes);
|
||||
token bar (no);
|
||||
EOF
|
||||
results = run_propane(capture: true)
|
||||
expect(results.stderr).to match /Error: Line 3: ptype no not declared\. Declare with `ptype` statement\./
|
||||
expect(results.status).to_not eq 0
|
||||
end
|
||||
|
||||
it "raises an error when a rule referenced ptype has not been defined" do
|
||||
write_grammar <<EOF
|
||||
ptype yes = int;
|
||||
token xyz;
|
||||
foo (yes) -> bar;
|
||||
bar (no) -> xyz;
|
||||
EOF
|
||||
results = run_propane(capture: true)
|
||||
expect(results.stderr).to match /Error: Line 4: ptype no not declared\. Declare with `ptype` statement\./
|
||||
expect(results.status).to_not eq 0
|
||||
end
|
||||
|
||||
%w[d c].each do |language|
|
||||
|
||||
context "#{language.upcase} language" do
|
||||
|
Loading…
x
Reference in New Issue
Block a user