| // Copyright 2018 The Amber Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef SRC_AMBERSCRIPT_PARSER_H_ |
| #define SRC_AMBERSCRIPT_PARSER_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "amber/result.h" |
| #include "src/parser.h" |
| #include "src/script.h" |
| |
| namespace amber { |
| |
| class Tokenizer; |
| |
| namespace amberscript { |
| |
| /// Parser for the `AmberScript` format. |
| class Parser : public amber::Parser { |
| public: |
| Parser(); |
| ~Parser() override; |
| |
| // amber::Parser |
| Result Parse(const std::string& data) override; |
| |
| private: |
| std::string make_error(const std::string& err); |
| Result ToShaderType(const std::string& str, ShaderType* type); |
| Result ToBufferType(const std::string& str, BufferType* type); |
| Result ToShaderFormat(const std::string& str, ShaderFormat* fmt); |
| Result ToPipelineType(const std::string& str, PipelineType* type); |
| Result ValidateEndOfStatement(const std::string& name); |
| |
| Result ParseBuffer(); |
| Result ParseBufferInitializer(Buffer*); |
| Result ParseBufferInitializerSize(Buffer*); |
| Result ParseBufferInitializerFill(Buffer*, uint32_t); |
| Result ParseBufferInitializerSeries(Buffer*, uint32_t); |
| Result ParseBufferInitializerData(Buffer*); |
| Result ParseShaderBlock(); |
| Result ParsePipelineBlock(); |
| Result ParsePipelineAttach(Pipeline*); |
| Result ParsePipelineShaderOptimizations(Pipeline*); |
| Result ParsePipelineShaderCompileOptions(Pipeline*); |
| Result ParsePipelineFramebufferSize(Pipeline*); |
| Result ParsePipelineBind(Pipeline*); |
| Result ParsePipelineVertexData(Pipeline*); |
| Result ParsePipelineIndexData(Pipeline*); |
| Result ParsePipelineSet(Pipeline*); |
| Result ParseRun(); |
| Result ParseClear(); |
| Result ParseClearColor(); |
| Result ParseExpect(); |
| Result ParseCopy(); |
| Result ParseDeviceFeature(); |
| Result ParseDeviceExtension(); |
| Result ParseInstanceExtension(); |
| Result ParseRepeat(); |
| Result ParseSet(); |
| bool IsRepeatable(const std::string& name) const; |
| Result ParseRepeatableCommand(const std::string& name); |
| Result ParseDerivePipelineBlock(); |
| Result ParsePipelineBody(const std::string& cmd_name, |
| std::unique_ptr<Pipeline> pipeline); |
| Result ParseShaderSpecialization(Pipeline* pipeline); |
| |
| /// Parses a set of values out of the token stream. |name| is the name of the |
| /// current command we're parsing for error purposes. The |type| is the type |
| /// of data we expect for the current buffer. |values| will be appended to |
| /// with the parsed values. |
| Result ParseValues(const std::string& name, |
| Format* fmt, |
| std::vector<Value>* values); |
| |
| std::unique_ptr<Tokenizer> tokenizer_; |
| std::vector<std::unique_ptr<Command>> command_list_; |
| }; |
| |
| } // namespace amberscript |
| } // namespace amber |
| |
| #endif // SRC_AMBERSCRIPT_PARSER_H_ |